C ++中的全局内存pipe理在堆栈还是堆?

如果我在C ++应用程序中全局声明一个数据结构,它会消耗堆栈内存还是堆内存?

例如

struct AAA { .../.../. ../../.. }arr[59652323]; 

因为我对答案不满意,希望同样的karjatkar想要学习的不仅仅是一个简单的是/否的答案,在这里你去。

通常一个进程分配了5个不同的内存区域

  1. 代码 – 文本段
  2. 初始化数据 – 数据段
  3. 未初始化的数据 – bss段

如果你真的想知道什么是保存在哪里然后阅读和书签这些:

编译器,汇编器,链接器和装载器:一个简短的故事 (见表w.5)

记忆中的一个程序剖析

替代文字ModuleW_files/ccompilerlinker006.png

这里的问题是这个问题。 假设你已经有了一个小C(++,以及它们以相同的方式处理)程序如下:

 /* my.c */ char * str = "Your dog has fleas."; /* 1 */ char * buf0 ; /* 2 */ int main(){ char * str2 = "Don't make fun of my dog." ; /* 3 */ static char * str3 = str; /* 4 */ char * buf1 ; /* 5 */ buf0 = malloc(BUFSIZ); /* 6 */ buf1 = malloc(BUFSIZ); /* 7 */ return 0; } 
  1. 这不是在堆上的NOR堆中分配的。 而是将其作为静态数据分配,并放入大多数现代机器的内存段中。 实际的string也被分配为静态数据,并放入正确思维机器中的只读段。
  2. 只是一个静态分配的指针; 一个地址的空间,静态数据。
  3. 将指针分配在堆栈上,并在main返回时有效地释放。 string,因为它是一个常量,与其他string一起被分配在静态数据空间中。
  4. 实际上被分配完全像static关键字告诉你,它不会被分配在堆栈上。
  5. …但是buf1在堆栈上
  6. … malloc的缓冲空间在堆上。
  7. 顺便说一句,孩子们不要在家里尝试。 malloc具有感兴趣的返回值; 你应该总是检查返回值。

例如:

 char * bfr; if((bfr = malloc(SIZE)) == NULL){ /* malloc failed OMG */ exit(-1); } 

通常它不会消耗。 它试图把它们分配给一个可能保持大小不变​​的程序执行的内存段。 它可能是bss,堆栈,堆或数据。

都不是。 这是.data部分。

全局内存预分配在一个固定的内存块或堆中,具体取决于应用程序如何分配:

 byte x[10]; // pre-allocated by the compiler in some fixed memory block byte *y main() { y = malloc(10); // allocated on the heap } 

编辑

问题是令人困惑的: 如果我在C ++应用程序中全局分配一个数据结构,它会消耗堆栈内存还是堆内存?

“分配”? 这可能意味着很多事情,包括调用malloc()。 如果问题是“如果我在全球范围内声明和初始化数据结构”,情况就不一样了。

很多年前,当CPU仍在使用64K段时,一些编译器足够聪明,可以从堆中dynamic分配内存,而不是在.data段中保留块(由于内存架构的限制)。

我想我太老了….

在C ++中全局声明数据结构都不会占用堆或堆栈内存。 实际上,全局variables通常分配在整个程序中大小保持不变的数据段中。 堆栈和堆通常用于在执行程序期间创build和销毁的variables。

程序存储空间

全局对象本身会占用运行时或编译器在执行main之前保留的内存,这不是一个可变的运行时间成本,因此既不堆栈也不堆栈。

如果对象的ctor分配内存,它将在堆中,对象的后续分配将是堆分配。

它取决于全局对象的确切性质,如果它是一个指针或整个对象本身是全局的。

全局variables生活在堆上。 这是一个特殊的情况,因为他们活着的程序的生命

如果你用new或者malloc自己显式地分配内存,那么它将被分配到堆中。 如果编译器正在分配内存,那么它将被分配在堆栈上。