内存中的变量存储在C ++中?

时间:2010-06-26 17:06:22

标签: c++

如果我有这样的代码:

int e;
int* f;

int main() {
    int a, b, c;
    int* d;
}

这些变量存储在内存中的哪个位置? 而且,定义全局变量的问题是什么(在函数中,如本例中的main)?

5 个答案:

答案 0 :(得分:9)

实际上并没有保证在内存中放置变量,只保证行为。

但在大多数(可能是所有)实际系统中,ef将位于全局数据部分,而abcd混合使用寄存器和调用堆栈。 fd都可以指向内存中的任何位置(好吧,对于MMU,这不完全正确,它们可以指向映射到进程中的内存子集中的任何位置)。

答案 1 :(得分:6)

a,b,c和d将存在于堆栈中。如果要创建一个int实例(使用malloc或new),那么它将在堆上运行 - 但是名为“d”的指针仍然存在于堆栈中。

e和f在应用程序的内存空间中分配空间,即所谓的“数据段” - 请参阅:

  

http://en.wikipedia.org/wiki/Data_segment

您还询问了堆栈大小:由编译器配置,请参见此处:

  

http://msdn.microsoft.com/en-us/library/tdkhxaks(VS.71).aspx

答案 2 :(得分:3)

为什么你认为这很重要?请注意,在现代C ++中,使用本地指针变量非常罕见。

在典型系统中,a,b,c和d将存在于堆栈中。但这是一个实现细节,语言标准没有具体说明。

答案 3 :(得分:3)

通常,a,b,c,d *将在程序堆栈上定义,尽管C ++ ISO标准没有指定应该定义变量的位置。

对于第二个问题,全局变量的问题是它们没有保护。对于一个依赖全局变量的简单脚本/应用程序可能没问题,但是在库和更复杂的代码中它会产生一个潜在的问题:任何代码都可以随时更改具有全局作用域的变量值,留下任何依赖于全局变量的代码一个不受欢迎的状态。

此外,由于变量属于全局范围,如果您使用定义具有相同名称的全局变量的任何其他代码,它们将对潜在的命名冲突开放。

答案 4 :(得分:1)

重点是变量的范围,它定义了它们的生命周期。主程序的变量将在程序期间可用。 main中的变量将在main()函数的持续时间内可用。

实际上,函数范围的变量通常在堆栈上分配,而全局变量在堆上分配,但这是一个实现细节。

全局变量的主要问题是控制访问,在多线程程序中很难处理它们。

编辑:正如@FredOverflow指出的那样,全局变量通常分配在加载可执行映像时设置的数据区中。