如果我在 C + + 应用程序中全局声明一个数据结构,它是使用堆栈内存还是堆内存?
例如
struct AAA { .../.../. ../../.. }arr[59652323];
都不是。它是。数据部分。
全局内存预先分配在固定内存块或堆上,具体取决于应用程序如何分配:
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; }
main
static
buf1
malloc
例如:
char * bfr; if((bfr = malloc(SIZE)) == NULL){ /* malloc failed OMG */ exit(-1); }
既然我对答案不满意,并且希望同样的 Karjatkar 想要学到的不仅仅是一个简单的是或否的答案,给你。
通常进程具有 分配了5个不同的内存区域
如果你真的想知道什么是保存在哪里,然后阅读和书签这些:
编译器,装配器,连接器和装载器: 一个简短的故事 (看表 w.5)
内存程序剖析
在 C + + 中全局声明数据结构都不会消耗堆或堆栈内存。实际上,全局变量通常分配在一个数据段中,该数据段的大小在整个程序中保持不变。堆和堆通常用于在执行程序期间创建和销毁的变量。