Потребление памяти? - PullRequest
2 голосов
/ 12 марта 2009

У меня есть кусок кода, где

for ( ; ; )
{

  char *buf;

  /* Some code */
}

Вопрос в том, будет ли код выделять память каждый раз, когда он циклически повторяет цикл. Я имею в виду, что по крайней мере 4 байта будут зарезервированы для указателя, когда он будет циклическим

Ответы [ 4 ]

8 голосов
/ 12 марта 2009

Пространство для указателя будет выделено в стеке, но оно будет выталкиваться в конце каждой итерации, поэтому вам не нужно об этом беспокоиться.

5 голосов
/ 12 марта 2009

Я думаю, что любой разумный компилятор оптимизирует распределение. Например, взгляните на сборку, произведенную GCC:

_foo:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $40, %esp
L2:
    movl    -12(%ebp), %eax
    movl    %eax, (%esp)
    call    L_puts$stub
    jmp     L2
0 голосов
/ 13 марта 2009

Что вам, вероятно, нужно беспокоиться, так это память, на которую указывает buf. Вы вырезали код, который на самом деле использует buf, но если вы используете malloc () или подобное для создания буфера, он не будет освобожден, пока вы не освободите его ().

0 голосов
/ 12 марта 2009

Символ * будет перераспределен для каждой итерации, да, но он также будет освобожден до следующей итерации, поэтому, по крайней мере, это не приведет к утечке памяти (если вы не используете malloc без free в этом цикле).

В любом случае, вы должны вывести его из цикла for по соображениям производительности (хотя, возможно, компилятор оптимизирует это и не перераспределяет память для указателя, но я бы на это не рассчитывал).

...