答案 0 :(得分:6)
编译器会根据给定的基本优化对它们进行相同的处理 检查相当容易 - 考虑以下c代码:
#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>
绝对相同的汇编代码,因此 - 性能和内存使用完全相同。
编辑:正如达蒙在评论中所说的那样,可能会出现一些诸如复杂的非文字之类的极端情况,但这有点超出了问题。
答案 1 :(得分:3)
当用作常量表达式时,性能没有差异。如果用作左值,则需要定义static const
(内存)并访问(cpu)。