funktionsberechnung auch compiletime moeglich ?
-
hola
hab folgende funktion, bei der ich dachte, das sie schon waehrden dem compilieren berechnet wird und nicht mehr wahrend der laufzeit. messungen ergaben: pustekuchen, falsch gedacht.
template<class type> inline unsigned int maxNumbers(void) { type x; memset(&x, 0xFF, sizeof(type)); char buf[32]; if(isSigned (x)) x >>= 1; itoa((x), buf, 10); return strlen(buf) + ((isSigned(x) ? 1 : 0)); }muesste das nicht schon zur compilierzeit berechnet werden ?
getestet hab ich das mit einer for-schleife und einer addition.uint64 start, ende; test = StrToInt(Edit1->Text); uint32 result = 0; start = rdtsc(); for(unsigned int i = 0;i < test;++i) { if(maxNumbers<unsigned int>() > 4) result += i; } ende = rdtsc(); Memo1->Lines->Add(ende - start);Compilereinstellungen hab ich das optimum genommen, was der BCB her gibt.
oder liegt es an den funktionen memset und strlen, das er da nix wegoptimiert ?Meep Meep
-
Der Borland ist soundso ein Dreckscompiler, der wird dir das nie und nimmer wegoptimieren. Und ob die Bibliotheksfunktionen so weit nachgebildet sind bzw. ob das überhaupt erlaubt ist, kann ich nicht genau sagen. Möglicherweise kann's der KAI.
-
Meep Meep schrieb:
muesste das nicht schon zur compilierzeit berechnet werden ?
Nö, wieso?
memset, strlen und die anderen Funktionen vermutlich auch, sind Laufzeitfunktionen, da sie Laufzeit Parameter erhalten.
Wenn du sowas compile-time berechnen willst, dann benutze Meta Programmierung.
-
Dennoch dürfen sie wegoptimiert werden.