在对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说明中。
如果在全局命名空间中声明它,它很可能会占用空间。 如果在函数体中声明它,或者在某处声明它是“静态”的,编译器可以自由地删除它。 如果您全局声明它,编译器无法知道该常量是否从另一个转换单元引用。
以上就是c/c++开发分享const int不占用空间?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560728.html