Насколько эффективно постоянное сворачивание в компиляторе C?

Мой вопрос может быть слишком простым, но я не нашел ответа, извините за это.

если у меня есть такой код:

...
#define N 6
...
float a, b;
...
a = 2.0 * 3 * N * b;
...

затем, после компиляции, этот код станет чем-то вроде этого?

...
a = 36.0 * b;
...

Другими словами, постоянная часть будет вычислена во время компиляции, верно?

Заранее спасибо.

2 ответа

Решение

Скорее всего, но не гарантировано.

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

Вот пример кода,

#include <stdio.h>

#define val 10

int main()
{

int b = 100;
int k = (5 * val) + b;
//int k = (5 * 25) + b; 

return 0;
}

val заменяется 10 во время предварительной обработки,

cpp ss.c дает мне

int main()
{    
         int b = 100;
         int k = (5 * 10) + b;    
         return 0;
}

Если мы посмотрим на сборку (gcc -S ss.c),

 .file   "ss.c"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $100, -8(%rbp)
        movl    -8(%rbp), %eax
        addl    $50, %eax            //5 * 10 calculated !!!
        movl    %eax, -4(%rbp)
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
        .section        .note.GNU-stack,"",@progbits

поэтому константы вычисляются во время компиляции в gcc.

Другие вопросы по тегам