const int不占用空间?

在对Anonymous enum用法的 回答中 , Oli Charlesworth指出:

const int是不可变的,并且可能不会占用任何空间,具体取决于编译器选择的操作。

如果我声明const int i = 10 ,如果它“可能不占用任何空间”,那么该10如何存储?

假设int是4个字节,我假设保留至少4个字节来存储10作为const int

只要生成的代码提供相同的可观察副作用,编译器就可以自由地优化代码。

因此,可以优化变量以仅存在于寄存器中,或者用立即值替换。 在伪机器代码中:

 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 

除非你以一种需要地址的方式使用i ,否则编译器通常只会在编译时使用它,而在运行时,所有这些都将保留为10 ,而不是变量。

特别是,由于const不会改变,所以除非你做一些事情,比如将它传递给一个通过引用获取参数的函数,否则不需要将它实际存储在内存中。

好吧,说它占用空间有点误导,因为当然值仍将保留在内存中的指令空间中,但是不会分配空间来将变量存储为有问题的数据类型。 说可能的最小内存量可能更合适,我认为这是你的反应所指向的。

编译器可以在每次需要读取i替换数字10,而不是读取存储的值。

它可能是代码的一部分,并且可以用作常量立即值(例如#define FIVE 5 )。

编译器可能只是用常量10替换代码中所有出现的i 。不再是i ,因此没有空间要求,它的成本相同(如果编译器不是普通的哑或看到你丢弃const)就像使用魔法一样数字,只是使代码更易读。 使用小常量,它可以将它们折叠到assembly说明中。

如果在全局命名空间中声明它,它很可能会占用空间。 如果在函数体中声明它,或者在某处声明它是“静态”的,编译器可以自由地删除它。 如果您全局声明它,编译器无法知道该常量是否从另一个转换单元引用。