Это называется «постоянное складывание», и да, это произойдет до сборки. Сборка сама по себе обычно вообще не оптимизируется.
Рассмотрим минимальную программу
#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 не требует ни того, ни другого.