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

时间:2009-07-23 05:58:57

标签: c++ memory-management stack

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

例如

struct AAA
{

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

9 个答案:

答案 0 :(得分:129)

由于我对答案不满意,并希望同样的karjatkar想要学习的不仅仅是一个简单的是/否答案,所以你走了。

通常,流程分配 5个不同的内存区域

  1. 代码 - 文本段
  2. 初始化数据 - 数据段
  3. 未初始化的数据 - bss段
  4. 堆栈
  5. 如果您真的想要了解保存的内容,请阅读并为这些内容添加书签:

    COMPILER, ASSEMBLER, LINKER AND LOADER: A BRIEF STORY(见表w.5)

    Anatomy of a Program in Memory

    alt text

答案 1 :(得分:27)

这里的问题是问题。让我们假设你有一个很小的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. 实际上
  5. 的分配与2完全相同。static关键字告诉您它不会在堆栈中分配。
  6. ...但buf1在堆栈上,
  7. ...... malloc的缓冲区空间在堆上。
  8. 顺便说一下,孩子们不要在家里试试。 malloc具有感兴趣的回报值;你应该总是检查返回值。
  9. 例如:

    char * bfr;
    if((bfr = malloc(SIZE)) == NULL){
       /* malloc failed OMG */
       exit(-1);
    }
    

答案 2 :(得分:14)

通常它既不消耗也不消耗。它尝试将它们分配在一个内存段中,该段可能保持为程序执行的常量。它可能是bss,堆栈,堆或数据。

答案 3 :(得分:6)

都不是。它是.data部分。

答案 4 :(得分:5)

全局内存预先分配在固定内存块中或堆上,具体取决于应用程序的分配方式:

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段中保留块(由于内存架构的限制)。

我想我太老了......

答案 5 :(得分:2)

在C ++中全局声明数据结构都不会占用堆或堆栈内存。实际上,全局变量通常分配在整个程序期间大小保持不变的数据段中。堆栈和堆通常用于在执行程序期间创建和销毁的变量。

Program Memory Space

答案 6 :(得分:0)

全局对象本身将占用运行时或编译器在执行main之前为其保留的内存,这不是变量运行时成本,因此既不是堆栈也不是堆。

如果对象的ctor分配内存,它将在堆中,对象的任何后续分配都将是堆分配。

它取决于全局对象的确切性质,如果它是指针或整个对象本身是全局的。

答案 7 :(得分:-1)

全局变量存在于堆上。这些都是一个特例,因为它们适用于程序的生命期

答案 8 :(得分:-3)

如果您是由new或malloc自己显式分配内存,那么它将在堆中分配。如果编译器正在分配内存,那么它将在堆栈上分配。