这样做时:
const int a = 5;
我想知道是否会像变量那样得到4字节的内存? (在32位系统中)
答案 0 :(得分:15)
是的,它会。 虽然如果你从不接受它的地址,那么优化器可能会完全删除它,只需用你的情况下的数字5替换对常量的任何引用。
答案 1 :(得分:3)
取决于。
const int a = 5;
将占用四个字节的内存(或者系统中占用的字节数很多)。
如果你让它静止:
static const int a = 5;
然后,优化器可以自由地将a
的每个实例替换为值5.优化器不能在第一个(非静态)情况下执行此操作,因为您可以引用a
in一个单独的编译单元:
extern const int a;
答案 2 :(得分:1)
这取决于你的架构,但是你是否制作了一些const或者不是真正影响它的大小,而是它在内存中的位置。现在,有一些编译器优化可能会改变你认为实际发生的事情,但这是基本的想法。
答案 3 :(得分:1)
这取决于编译器。
例如:
const int a = 4;
这可以由编译器分配4个字节并仅强制执行不变性来处理。
如果您有一个常量字符串:
static final java.lang.String name = "Foobar";
编译器可以删除变量并将其替换为使用变量的实际字符串“Foobar”。这不会从堆中占用空间,但仍然必须存储在程序数据段中的某个位置。当Java找到一个在多个地方使用的带引号的字符串时,它会尝试执行此操作,因此它只需要存储一个副本。
无论哪种方式,常量都不会消除存储分配。充其量只能最小化所需的存储空间。
答案 4 :(得分:1)
int a
和const int a
之间的内存消耗没有差异。
但请注意,在声明为const
的C对象中,不会形成常量表达式(与C ++相反),并且默认情况下具有外部链接(与C ++相反)。所有这些意味着在C中,常量对象与非常量对象几乎相同,只是不可修改。
此外,这意味着在C中,一个常量对象几乎没有机会被“删除”,正如其他答案所声称的那样。如果您真的希望它在C中使其“可移动”,则必须明确地将其声明为static
。但即使这样也不会使const int
对象形成常量表达式,即你仍然不能用它来指定C89 / 90和C99中的数组大小,结果数组仍然是一个可变长度数组(VLA) )。
答案 5 :(得分:0)
它可能需要通常的数量,但是如果你只是以永远不需要它的方式使用它,那么编译器/链接器可以对其进行优化,以便它根本不占用任何内存。
答案 6 :(得分:0)
通常,常量将占用与变量相同的空间,因此如果在您的体系结构中int为32位,则a也将为32位。 但是编译器也可能决定直接将常量放入代码中,而不是为常量本身提供空间。这将取决于实际定义常量的位置,这意味着编译器是否能够确定没有机会修改a(例如通过const转换)或获取a的地址。
答案 7 :(得分:0)
一个常量变量需要4个字节的内存,但是如果它是一个值则需要0个字节,因为汇编代码会嵌入像这样的值
mov eax,5
这里有5个来自变量,但它是常量5,它甚至会生成更快的代码,因为不需要内存调用来检索值,它只是汇编代码的一部分
答案 8 :(得分:-1)
在嵌入式系统中,只读存储器与可写存储器分开,此常量不占用RAM,只存储在ROM中。同样,在具有虚拟内存的系统上,常量将被加载到只读内存页中,无论程序运行副本多少,都只会占用一次RAM。