繁体   English   中英

堆栈或堆中C ++中的全局内存管理?

[英]Global memory management in C++ in stack or heap?

如果我在C ++应用程序中全局声明数据结构,它会消耗堆栈内存还是堆内存?

例如

struct AAA
{

.../.../.
../../..
}arr[59652323];

由于我对答案不满意,并希望同一个karjatkar想要学习的不仅仅是简单的是/否答案,所以您可以继续。

通常,一个进程分配了5个不同的内存区域

  1. 代码-文本段
  2. 初始化数据–数据段
  3. 未初始化的数据– bss段

如果您真的想了解保存在哪里的内容,请阅读并添加以下标签:

编译器,汇编器,链接器和装载器:一个简短的故事 (请参阅表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;
}
  1. 这既不在堆的堆栈NOR上分配,也没有分配。 相反,它被分配为静态数据,并在大多数现代计算机上放入其自己的内存段中。 实际的字符串也被分配为静态数据,并放在思想正确的机器中的只读段中。
  2. 只是一个静态分配的指针; 静态数据中一个地址的空间。
  3. 堆栈上分配了指针,当main返回时将有效释放该指针。 由于字符串是常量,因此它与其他字符串一起分配在静态数据空间中。
  4. 实际上实际上是像2一样分配的static关键字告诉您不要在堆栈上分配它。
  5. ...但是buf1在堆栈上,并且
  6. ...已分配的缓冲区空间在堆上。
  7. 顺便说一句,孩子们不要在家尝试这个。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM