C+中的全局内存管理+;成堆还是成堆? < P>如果在C++应用程序中全局声明数据结构,它会占用堆栈内存或堆内存吗?
例如C+中的全局内存管理+;成堆还是成堆? < P>如果在C++应用程序中全局声明数据结构,它会占用堆栈内存或堆内存吗?,c++,memory-management,stack,C++,Memory Management,Stack,例如 struct AAA { .../.../. ../../.. }arr[59652323]; 都不是。它是.data节。全局内存预先分配在固定内存块或堆中,具体取决于应用程序如何分配: byte x[10]; // pre-allocated by the compiler in some fixed memory block byte *y main() { y = malloc(10); // allocated on the heap } 编辑: 这个问题令人困惑:如
struct AAA
{
.../.../.
../../..
}arr[59652323];
都不是。它是.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段时,一些编译器足够聪明,可以从堆中动态分配内存,而不是在.data段中保留块(因为内存体系结构的限制)
我想我太老了……如果您自己通过new或malloc显式地分配内存,那么它将在heap中分配。如果编译器正在分配内存,那么它将被分配到堆栈上。通常它都不消耗内存。它试图将它们分配到一个内存段中,该内存段对于程序的执行可能保持不变的大小。它可能是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
在堆栈上,并且char * bfr;
if((bfr = malloc(SIZE)) == NULL){
/* malloc failed OMG */
exit(-1);
}
因为我对答案不满意,希望sameer karjatkar想了解的不仅仅是简单的是/否答案,给你 通常,一个进程分配了5个不同的内存区域
在C++中声明全局数据结构既不消耗堆内存也不占用堆栈内存。实际上,全局变量通常分配在一个数据段中,该数据段的大小在整个程序中保持不变。堆栈和堆通常用于在执行程序期间创建和销毁的变量
这取决于全局内存是内联分配还是从应用程序动态分配的。如果内存是动态分配的,则它不是全局的(在全局变量的意义上),那么如果它不在所有程序的范围内,它在什么意义上是全局的@Philippe-关键是全局指针指向的数据不能被认为是全局的。它甚至可以在程序执行期间更改(不同的函数可能会将全局指针重置到它们想要的任何位置)@Philippe:.数据段也不仅仅是.EXE。全局内存永远不会在堆栈上分配。堆栈仅用于局部变量和参数。当函数返回时,堆栈变量被“销毁”。通过编辑boot.ini文件,我们可以将虚拟内存扩展到3GB。像wise一样,内存段是否有任何设置?这将是毫无意义的,因为静态分配内存的大小永远不会改变malloced缓冲区空间与全局变量无关。只有指针是全局的。请不要再把人们弄糊涂了。哦,别傻了。提问者显然不清楚是什么原因,所以我写了一个答案,旨在提高他的理解。另外,全局变量和静态变量(在函数中)之间有什么区别。他们必须为项目的生命而活……同意,但他们之间存在差异accessibility@dspinozzi:在main()之前调用全局变量的构造函数,但在第一次调用函数时调用静态变量的构造函数。这两种类型的变量通常存储在内存的相同部分——我认为GCC将它们放在.data部分。它说“在堆上分配”,这是非常正确的。除非这个问题被标记为“新手”或“初学者”,否则这应该足以提醒我们正在发生什么。@Don:不。全局对象是指针,而不是它指向的内存。您可以按自己的方式处理内存。也不是为了一直跑下去。你甚至可以把它指向stack somet