Das ist richtig. Meine Funktion hat den Vorteil, dass sie mathematisch beweisbar ist.
Hier mal ein kleiner Brute-Force-Test um sich ein Urteil über die Qualität der Compileroptimierung zu bilden.
Meine Version (-O0, -O1, -O2)
GCC: 94s, 10s, 10s
Clang: 113s, 0s, 0s
Deine Version (-O0, -O1, -O2)
GCC: 29s, 0s, 0s
Clang: 28s, 9s, 0s
Die Werte vom MSVC würden mich hier mal interessieren.
P.S.: Wenn es weniger als 1s dauer Optimiert der Compiler die Schleife in der main()-Funktion weg.
Hier mal ein kleiner Brute-Force-Test um sich ein Urteil über die Qualität der Compileroptimierung zu bilden.
Code:
#include <stdio.h>
#include <stdint.h>
static inline uint32_t swap32_llm(uint32_t v) {
return (v >> 24) |
((v >> 8) & 0x0000FF00u) |
((v << 8) & 0x00FF0000u) |
(v << 24);
}
static inline uint32_t swap32_hen(uint32_t v) {
unsigned char tmp[4] = { 0 };
uint32_t retval = 0L;
tmp[0] = (v >> 0) & 0xff;
tmp[1] = (v >> 8) & 0xff;
tmp[2] = (v >> 16) & 0xff;
tmp[3] = (v >> 24) & 0xff;
retval |= tmp[0];
retval <<= 8L;
retval |= tmp[1];
retval <<= 8L;
retval |= tmp[2];
retval <<= 8L;
retval |= tmp[3];
return retval;
}
int main() {
for (uint32_t i = 0; i < 0xffffffff; i++) {
if (i != swap32_llm(swap32_llm(i))) {
printf("FEHLER\n");
}
}
}Meine Version (-O0, -O1, -O2)
GCC: 94s, 10s, 10s
Clang: 113s, 0s, 0s
Deine Version (-O0, -O1, -O2)
GCC: 29s, 0s, 0s
Clang: 28s, 9s, 0s
Die Werte vom MSVC würden mich hier mal interessieren.
P.S.: Wenn es weniger als 1s dauer Optimiert der Compiler die Schleife in der main()-Funktion weg.


