[英]Global memory management in C++ in stack or heap?
如果我在C ++应用程序中全局声明数据结构,它会消耗堆栈内存还是堆内存?
例如
struct AAA
{
.../.../.
../../..
}arr[59652323];
由于我对答案不满意,并希望同一个karjatkar想要学习的不仅仅是简单的是/否答案,所以您可以继续。
通常,一个进程分配了5个不同的内存区域
如果您真的想了解保存在哪里的内容,请阅读并添加以下标签:
编译器,汇编器,链接器和装载器:一个简短的故事 (请参阅表w.5)
这里的问题是问题。 假设您有一个很小的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段中保留块(由于内存体系结构的限制)。
我想我太老了...
在C ++中全局声明数据结构都不会消耗堆或堆栈内存。 实际上,全局变量通常分配在整个程序中大小保持不变的数据段中。 堆栈和堆通常用于在执行程序期间创建和销毁的变量。
全局对象本身将在运行main之前占用运行时或编译器为其保留的内存,这不是可变的运行时成本,因此堆栈或堆均无。
如果对象的ctor分配内存,它将在堆中,并且该对象随后进行的任何分配都是堆分配。
这取决于全局对象的确切性质,是指针还是全局对象本身。
全局变量存在于堆中。 这是一个特例,因为它们在程序的整个生命周期中都存在
如果您要通过new或malloc显式分配内存,那么它将在堆中分配。 如果编译器正在分配内存,那么它将在堆栈上分配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.