在对answer的the usage of Anonymous enum的评论中,Oli Charlesworth说明:
const int是不可变的,并且可能不会占用任何空间,具体取决于 编译器选择做什么。
如果我声明const int i = 10
,如果10
“可能不会占用任何空间”,那该怎么存储?
假设int
是4个字节,我认为保留至少4个字节以将10存储为const int
。
答案 0 :(得分:9)
只要生成的代码提供相同的可观察副作用,编译器就可以根据需要自由优化代码。
因此,变量可以优化为仅存在于寄存器中,或者替换为立即值。在伪机器代码中:
SET 10, eax
ST eax, &i # Initialise i
...
LD &i, eax # Add i to ebx
ADD eax, ebx, ebx
可能会成为:
SET 10, eax
ADD eax, ebx, ebx
甚至只是:
ADD 10, ebx, ebx
答案 1 :(得分:6)
除非你以一种需要地址的方式使用i
,否则编译器通常只会在编译时使用它,而在运行时,所有这些都将保留为10
,而不是变量
特别是,由于const
没有改变,所以除非你做一些事情,比如将它传递给一个通过引用获取参数的函数,否则不需要将它实际存储在内存中。
答案 2 :(得分:4)
嗯,说它会占用没有空间有点误导,因为当然值仍将保留在内存中的指令空间中,但不会分配空间来存储变量作为有问题的数据类型。说出可能的最小内存量可能更合适,我认为这是你的反应所指向的。
答案 3 :(得分:3)
编译器可以在每次需要读取i
时替换数字10,而不是读取存储的值。
答案 4 :(得分:2)
它可能是代码的一部分,例如用作常量立即值(例如#define FIVE 5
)。
答案 5 :(得分:2)
编译器可能只是用常量10替换代码中所有出现的i
。不再i
,因此没有空间要求,它的成本相同(如果编译器不是普通的哑巴)或者看到你将const转换为使用魔术数字,只是为了使代码更具可读性。使用小常量,它可以将它们折叠到装配说明中。
答案 6 :(得分:0)
如果在全局命名空间中声明它,它很可能会占用空间。如果你在一个函数体中声明它,或者声明它是静态的'某处,编译器可以自由删除它。如果您全局声明它,编译器无法知道该常量是否从另一个转换单元引用。