【发布时间】:2010-03-08 10:05:21
【问题描述】:
最近,我正在研究#define、const 和 enum 的汇编代码:
C 代码(#define):
3 #define pi 3
4 int main(void)
5 {
6 int a,r=1;
7 a=2*pi*r;
8 return 0;
9 }
GCC 生成的汇编代码(c 代码中的第 6 行和第 7 行):
6 mov $0x1, -0x4(%ebp)
7 mov -0x4(%ebp), %edx
7 mov %edx, %eax
7 add %eax, %eax
7 add %edx, %eax
7 add %eax, %eax
7 mov %eax, -0x8(%ebp)
C 代码(枚举):
2 int main(void)
3 {
4 int a,r=1;
5 enum{pi=3};
6 a=2*pi*r;
7 return 0;
8 }
GCC 生成的汇编代码(c 代码中的第 4 行和第 6 行):
6 mov $0x1, -0x4(%ebp)
7 mov -0x4(%ebp), %edx
7 mov %edx, %eax
7 add %eax, %eax
7 add %edx, %eax
7 add %eax, %eax
7 mov %eax, -0x8(%ebp)
C 代码(常量):
4 int main(void)
5 {
6 int a,r=1;
7 const int pi=3;
8 a=2*pi*r;
9 return 0;
10 }
GCC 生成的汇编代码(c 代码中的第 7 行和第 8 行):
6 movl $0x3, -0x8(%ebp)
7 movl $0x3, -0x4(%ebp)
8 mov -0x4(%ebp), %eax
8 add %eax, %eax
8 imul -0x8(%ebp), %eax
8 mov %eax, 0xc(%ebp)
我发现使用#define和enum,汇编代码是一样的。编译器使用 3 个加法指令来执行乘法运算。但是,当使用const 时,会使用imul 指令。
有谁知道这背后的原因吗?
【问题讨论】:
-
什么版本的 gcc 和什么优化标志?
-
gcc (GCC) 4.4.2 20091222 (Red Hat 4.4.2-20) 我没有指定优化标志(默认)。