如果我在C ++应用程序中全局声明数据结构,它会消耗堆栈内存还是堆内存?
例如
struct AAA
{
.../.../.
../../..
}arr[59652323];
如果我在C ++应用程序中全局声明数据结构,它会消耗堆栈内存还是堆内存?
例如
struct AAA
{
.../.../.
../../..
}arr[59652323];
Answers:
由于我对答案不满意,并希望同一个karjatkar想要学习的不仅仅是简单的是/不是答案,所以就去吧。
通常,一个进程分配了5个不同的内存区域
如果您真的想了解保存在何处的内容,请阅读并添加以下标签:
编译器,汇编器,链接器和装载器:一个简短的故事(请参阅表w.5)
route_t* tblhead = NULL;
这里的问题是问题。假设您有一个很小的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);
}
通常它不消耗任何东西。它尝试将它们分配到可能会在程序执行中保持恒定大小的内存段中。可能是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段时,一些编译器很聪明,可以从堆中动态分配内存,而不是在.data段中保留块(由于内存体系结构的限制)。
我想我太老了...
全局对象本身将在执行main之前占用运行时或编译器为其保留的内存,这不是可变的运行时成本,因此堆栈或堆均无。
如果对象的ctor分配内存,则它将在堆中,并且该对象随后进行的任何分配都是堆分配。
这取决于全局对象的确切性质,是指针还是全局对象本身。
如果您要通过new或malloc显式分配内存,那么它将在堆中分配。如果编译器正在分配内存,那么它将在堆栈上分配。