如果我在 C++ 应用程序中全局声明一个数据结构,它会消耗堆栈内存还是堆内存?
例如:
例如:
struct AAA
{
.../.../.
../../..
}arr[59652323];
struct AAA
{
.../.../.
../../..
}arr[59652323];
由于我不满意答案,并希望sameer karjatkar想要学习的不仅仅是简单的是/否答案,所以在这里给出更多解释。
通常一个进程有5个不同区域的分配内存:
如果你真想了解每个区域保存了什么,请阅读并收藏以下链接:
编译器、汇编器、链接器和装载程序:简介(查看表格w.5)
route_t* tblhead = NULL;
- philx_x/* 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);
}
全局内存在固定的内存块或堆上预先分配,具体取决于应用程序的分配方式:
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段中保留一个块(因为内存架构的限制)。
我想我只是太老了……
在C++中,全局声明数据结构既不会消耗堆内存也不会消耗栈内存。实际上,全局变量通常分配在数据段中,该段的大小在整个程序执行期间保持不变。堆和栈通常用于在程序执行期间创建和销毁的变量。
全局对象本身将占用运行时或编译器在执行main之前为其保留的内存,这不是变量运行时成本,因此既不是堆栈也不是堆。
如果对象的构造函数分配内存,则将在堆中进行任何后续的对象分配都将是堆分配。
这取决于全局对象的确切性质,如果它是指针还是整个对象本身是全局的。
全局变量存储在堆上。这是一个特殊情况,因为它们的生命周期与程序相同。