c/c++语言开发共享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说明中。

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

      以上就是c/c++开发分享const int不占用空间?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560728.html

      Like (0)
      Previous 2021年1月28日
      Next 2021年1月28日

      精彩推荐