C中常量需要多少内存?

时间:2009-11-03 16:23:34

标签: c const

这样做时:

const int a = 5;

我想知道是否会像变量那样得到4字节的内存? (在32位系统中)

9 个答案:

答案 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 aconst 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。