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

Global memory management in C++ in stack or heap?

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

例如:

1
2
3
4
5
6
struct AAA
{

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


因为我对答案不满意,并且希望Sameer Karjatkar想学习的不仅仅是一个简单的是/不是答案,给你。

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

  • 代码-文本段
  • 初始化数据–数据段
  • 未初始化的数据–BSS段
  • 如果您真的想了解保存在何处的内容,请阅读并将其添加到书签中:

    编译器、汇编程序、链接器和加载器:一个简单的故事(看表W.5)

    记忆中程序的解剖

    alt text


    问题就在这里。假设您有一个很小的C(++,它们处理的方式相同)程序,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* 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返回时,指针将被有效释放。由于字符串是常量,因此它与其他字符串一起分配在静态数据空间中。
  • 实际分配与2完全相同。static关键字告诉您不在堆栈上分配它。
  • …但是buf1在堆栈上,并且
  • …内存不足的缓冲区空间在堆中。
  • 顺便说一句,孩子们不在家里尝试这个。malloc有一个利息的返回值;您应该经常检查返回值。
  • 例如:

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


    通常这两者都不消耗。它试图将它们分配到一个内存段中,该内存段很可能保持不变的大小以供程序执行。它可能是BSS、堆栈、堆或数据。


    两者都不。是数据区。


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

    1
    2
    3
    4
    5
    6
    7
    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++中全局声明数据结构既不消耗堆内存,也不消耗堆栈内存。实际上,全局变量通常分配在一个数据段中,在整个程序期间,该数据段的大小保持不变。堆栈和堆通常用于在执行程序期间创建和销毁的变量。

    Program Memory Space


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

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

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


    全局变量位于堆中。这是一个特殊的案例,因为它们是为项目的生命而活的。


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