2013-07-27 14 views
5
while(count < 30000000){ 
    malloc(24); 
    count++; 
} 

der obige Code läuft in etwa 170 ms auf meinem Computer mit gcc-O0 kompiliert. Beim Kompilieren mit -Ox, wobei x> 0 ist, stellt der Optimierer jedoch fest, dass der angeforderte Speicher niemals verwendet wird und daher von der optimierten ausführbaren Datei ausgeschlossen wird. Wie macht es das?malloc und gcc optimierung 2

+3

Was bedeutet '2' im Titel bedeuten? es ist nicht klar. –

+0

@YuHao verwiesen sie auf [ihre vorherige Frage] (http://stackoverflow.com/questions/17848426/malloc-and-gcc-optimization) –

Antwort

8

Nun sieht der Compiler malloc Rückgabewert wird nie verwendet, so dass es optimiert wird. Wenn Sie malloc Anruf verhindern wollen auch in -O3 werden optimierter aus können Sie die volatile Qualifier verwenden:

while(count < 30000000){ 
    void * volatile p = malloc(24); 
    count++; 
} 
+0

Danke für die Antwort und arbeiten um. Das ist wirklich super. Bedeutet das, dass der Compiler das malloc-Symbol kennt? Ich sehe nicht, wie sonst könnte es gemacht werden. Ich meine, wenn Sie Ihren eigenen Allokator schreiben würden, könnten Sie das gleiche Verhalten auslösen? – user2616927

+0

@ user2616927 der Optimierer weiß 'malloc' und betrachtet es als eine Funktion ohne Nebenwirkungen. – ouah

+1

Ja, Sie können das ['pure' oder' const' Attribut] (http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html) verwenden, damit der Optimierer ähnliche Optimierungen bezüglich Ihrer eigenen Funktionen vornehmen kann . –