const int不占用空间?

时间:2011-08-22 13:14:38

标签: c memory int

在对answerthe usage of Anonymous enum的评论中,Oli Charlesworth说明:

  

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

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

假设int是4个字节,我认为保留至少4个字节以将10存储为const int

7 个答案:

答案 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)

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