2009-03-12 15 views
2

Ich habe ein Stück Code, woSpeicherverbrauch?

for (; ;) 
{ 

    char *buf; 

    /* Some code */ 
} 

Die Frage hier wird der Code-Speicher jedes Mal, wenn es Zyklen durch die Schleife zuzuordnen. Ich meine, mindestens 4 Bytes sind reserviert für den Zeiger, wenn es Zyklen.

Antwort

8

Platz für den Zeiger wird auf dem Stapel zugewiesen, aber er wird am Ende jeder Iteration ausgeblendet, sodass Sie sich keine Gedanken darüber machen müssen.

0

Das char * wird für jede Iteration neu zugewiesen, aber es wird auch vor der nächsten Iteration freigegeben, so dass zumindest kein Speicherverlust entsteht (es sei denn, Sie verwenden malloc ohne free in dieser Schleife) .

Wie auch immer, Sie sollten es aus Gründen der Leistung aus der for-Schleife (obwohl vielleicht der Compiler dies optimiert und nicht neu zuordnen den Speicher für den Zeiger, aber ich würde nicht darauf zählen).

+0

das ist Mikro-Optimierung. Lassen Sie den Compiler das für Sie tun. – Alnitak

5

Ich denke jeder vernünftige Compiler wird die Zuordnung optimieren. Nehmen wir zum Beispiel einen Blick auf die GCC-produziert Montage:

_foo: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $40, %esp 
L2: 
    movl -12(%ebp), %eax 
    movl %eax, (%esp) 
    call L_puts$stub 
    jmp  L2 
0

Was Sie vielleicht brauchen zu kümmern, ist die Erinnerung, dass buf zeigt. Sie haben den Code herausgefiltert, der tatsächlich buf verwendet, aber wenn Sie malloc() oder ähnliches verwenden, um einen Puffer zu erstellen, wird er nicht freigegeben, es sei denn, Sie befreien ihn ebenfalls().