在堆栈或堆中使用 C + + 进行全局内存管理?

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

例如

struct AAA
{


.../.../.
../../..
}arr[59652323];
65671 次浏览

都不是。它是。数据部分。

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

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 段时,一些编译器非常聪明,能够从堆中动态分配内存,而不是在。数据段(由于内存架构的限制)。

我想我只是太老了。

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

通常两者都不会消耗。它试图将它们分配到一个内存段中,这个内存段对于程序执行来说可能保持常量大小。它可能是 bss、栈、堆或数据。

全局变量存在于堆中。这是一个特例,因为它们存在于程序的整个生命周期中

在执行 main 之前,全局对象本身将占用运行时或编译器为其保留的内存,这不是一个可变的运行时开销,因此堆栈和堆都不是。

如果对象的 ctor 分配内存,它将位于堆中,对象随后的任何分配都将是堆分配。

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

这里的问题就是这个问题。假设你有一个很小的 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. 这既没有在堆栈上分配,也没有在堆上分配。相反,它被分配为静态数据,并放入大多数现代机器上自己的内存段中。实际的 绳子也被分配为静态数据,并被放入正确思考的机器中的只读段中。
  2. 只是一个静态分配的指针; 静态数据中一个地址的空间。
  3. 已经在 上分配了指针,当 main返回时将被有效地释放。由于该字符串是一个常量,因此与其他字符串一起在静态数据空间中分配。
  4. 实际上是按照2来分配的。static关键字告诉您不要在堆栈上分配它。
  5. 但是 buf1在堆栈上
  6. ... malloc 的缓冲区空间就在堆上。
  7. 顺便说一句,孩子们不会在家尝试这个。malloc有一个感兴趣的返回值; 您应该检查 一直都是的返回值。

例如:

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

既然我对答案不满意,并且希望同样的 Karjatkar 想要学到的不仅仅是一个简单的是或否的答案,给你。

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

  1. 代码文本段
  2. 初始化数据-数据段
  3. 未初始化的 data-bss 段
  4. Stack

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

编译器,装配器,连接器和装载器: 一个简短的故事 (看表 w.5)

内存程序剖析

alt text

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

Program Memory Space