Gcc автоматически выполняет математические операции над константными значениями во время компиляции - PullRequest
0 голосов
/ 07 ноября 2018

Допустим, мы выполняем

malloc(4 * sizeof(int))

Теперь число 4 является константой, и, насколько я понимаю, sizeof на самом деле является функцией времени компиляции (если только внутри нее нет переменной).

В этом случае (с учетом x86) sizeof(int) также будет 4. Мой вопрос: будет ли оптимизация gcc выполнять вычисления самостоятельно или будет сгенерировано уравнение в asm?

1 Ответ

0 голосов
/ 07 ноября 2018

Это называется «постоянное складывание», и да, это произойдет до сборки. Сборка сама по себе обычно вообще не оптимизируется.

Рассмотрим минимальную программу

#include <stdlib.h>

int main(void)
{
    malloc(4 * sizeof(int));
}

Мы можем скомпилировать его в сборку с gcc -S. На моем компьютере полученная сборка говорит:

main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $16, %edi
        call    malloc@PLT
        movl    $0, %eax
        popq    %rbp
        ret

т.е. единственные константы, которые вы видите, это 16 (4 * sizeof(int)) и 0 (неявное возвращаемое значение из main()).


Обратите внимание, что в C есть класс выражений, которые называются "целочисленными константами", которые должны вычисляться во время компиляции. Вы можете использовать 4 * sizeof(int) в качестве размера массива - или даже в предложении _Static_assert - естественно, тогда должен оцениваться во время компиляции, но в общем случае, например, здесь, стандарт C не требует ни того, ни другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...