#define a 1
static const int b = 2;
typedef enum {FOUR = 4} enum_t;
int main() {
enum_t c = FOUR;
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",c);
return 0;
}
使用gcc -O3编译:
0000000000400410 <main>:
400410: 48 83 ec 08 sub $0x8,%rsp
400414: be 01 00 00 00 mov $0x1,%esi
400419: bf 2c 06 40 00 mov $0x40062c,%edi
40041e: 31 c0 xor %eax,%eax
400420: e8 cb ff ff ff callq 4003f0 <printf@plt>
400425: be 02 00 00 00 mov $0x2,%esi
40042a: bf 2c 06 40 00 mov $0x40062c,%edi
40042f: 31 c0 xor %eax,%eax
400431: e8 ba ff ff ff callq 4003f0 <printf@plt>
400436: be 04 00 00 00 mov $0x4,%esi
40043b: bf 2c 06 40 00 mov $0x40062c,%edi
400440: 31 c0 xor %eax,%eax
400442: e8 a9 ff ff ff callq 4003f0 <printf@plt>
完全相同的汇编代码,因此 - 具有完全相同的性能和内存使用情况。
编辑:如达蒙在评论中所述,可能存在一些边角案例,例如复杂的非文字常量,但这超出了问题范围。
static const&
也可以被轻松地进行优化,但实际上并不是这样。例如,struct foo {int bar;}; static const& bar_ref = foo.bar;
明显比 #define bar_ref foo.bar
更具开销。(是的,实际上有一些需要使用这种丑陋写法的情况,别问为什么。) - Damon当作为常量表达式使用时,性能没有区别。如果作为lvalue使用,static const
将需要被定义(内存)和访问(CPU)。