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

sam*_*kar 70 c++ stack memory-management

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

例如

struct AAA
{

.../.../.
../../..
}arr[59652323];
Run Code Online (Sandbox Code Playgroud)

Mil*_*lan 132

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

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

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

如果您真的想学习保存的内容,请阅读并为这些书签添加书签:

编译器,装配器,链接器和装载器:简要介绍(见表w.5)

记忆中程序的剖析

替代文字http://www.tenouk.com/ModuleW_files/ccompilerlinker006.png

  • 重要的一点是,当程序首次加载到内存时,会分配bss和数据段,并且它们的大小在运行时不会改变.相反,堆的内容是易变的,并且在整个运行过程中发生变化,因为执行了动态内存操作. (7认同)
  • 我认为让堆栈向下生长并让堆向上增长的想法是他们可以以任何比例使用可用内存.但是,通过在两者之间加载动态库是不是可以阻止? (3认同)

Cha*_*tin 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;
}
Run Code Online (Sandbox Code Playgroud)
  1. 这既不在堆上的堆栈NOR上分配.相反,它被分配为静态数据,并在大多数现代机器上放入自己的内存段.实际的字符串也被分配为静态数据,并放入正确思考的机器中的只读段.
  2. 只是一个静态分配的指针; 静态数据中的一个地址空间.
  3. 具有在堆栈上分配的指针,并且在main返回时将被有效地释放.字符串,因为它是一个常量,在静态数据空间中与其他字符串一起分配.
  4. 实际上分配与2完全相同.static关键字告诉您它不会在堆栈上分配.
  5. ......但是buf1在堆栈上,并且
  6. ... malloc的缓冲区空间在堆上.
  7. 顺便说一下,孩子们不要在家里试试. malloc具有感兴趣的回报值; 你应该经常检查返回值.

例如:

char * bfr;
if((bfr = malloc(SIZE)) == NULL){
   /* malloc failed OMG */
   exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

  • 哦,别傻了.提问者显然不知道到底在哪里,所以我写了一个答案,旨在提高他的理解. (7认同)

Tom*_*zuk 14

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


EFr*_*aim 6

都不是.它是.data部分.

  • @Philippe - 关键是全局指针**指向的数据不能被视为全局数据.它甚至可以在程序执行期间改变(不同的函数可能会将全局指针重置为他们想要的任何位置) (2认同)

Phi*_*ert 5

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

byte x[10]; // pre-allocated by the compiler in some fixed memory block
byte *y

main()
{
   y = malloc(10); // allocated on the heap
}
Run Code Online (Sandbox Code Playgroud)

编辑:

问题很混乱:如果我在C++应用程序中全局分配数据结构,它是否会消耗堆栈内存或堆内存?

"分配"?这可能意味着许多事情,包括调用malloc().如果问题是"如果我在全球范围内声明并初始化数据结构",情况会有所不同.

许多年前,当CPU仍在使用64K段时,一些编译器足够聪明,可以从堆中动态分配内存,而不是在.data段中保留块(由于内存架构的限制).

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


小智 5

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

程序存储空间