Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的全局内存管理+;成堆还是成堆? < P>如果在C++应用程序中全局声明数据结构,它会占用堆栈内存或堆内存吗?_C++_Memory Management_Stack - Fatal编程技术网

C+中的全局内存管理+;成堆还是成堆? < P>如果在C++应用程序中全局声明数据结构,它会占用堆栈内存或堆内存吗?

C+中的全局内存管理+;成堆还是成堆? < P>如果在C++应用程序中全局声明数据结构,它会占用堆栈内存或堆内存吗?,c++,memory-management,stack,C++,Memory Management,Stack,例如 struct AAA { .../.../. ../../.. }arr[59652323]; 都不是。它是.data节。全局内存预先分配在固定内存块或堆中,具体取决于应用程序如何分配: byte x[10]; // pre-allocated by the compiler in some fixed memory block byte *y main() { y = malloc(10); // allocated on the heap } 编辑: 这个问题令人困惑:如

例如

struct AAA
{

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

都不是。它是.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段中保留块(因为内存体系结构的限制)


我想我太老了……

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

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

全局变量位于堆上。这是一种特殊情况,因为它们在程序的生命周期内存在。全局对象本身将占用运行时或编译器在执行main之前为其保留的内存,这不是可变的运行时成本,因此堆栈和堆都不会

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


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

这里的问题是问题。假设你有一个很小的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
    返回时有效地解除分配。由于字符串是常量,所以它与其他字符串一起分配在静态数据空间中
  • 实际上,它的分配方式与2完全相同。
    static
    关键字告诉您不能在堆栈上分配它
  • …但是
    buf1
    在堆栈上,并且
  • 。。。malloc'ed缓冲区空间位于堆上
  • 顺便说一句,孩子们不会在家里尝试这个<代码>malloc具有感兴趣的返回值;您应该始终检查返回值
  • 例如:

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

    因为我对答案不满意,希望sameer karjatkar想了解的不仅仅是简单的是/否答案,给你

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

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

    (见表w.5)


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


    这取决于全局内存是内联分配还是从应用程序动态分配的。如果内存是动态分配的,则它不是全局的(在全局变量的意义上),那么如果它不在所有程序的范围内,它在什么意义上是全局的@Philippe-关键是全局指针指向的数据不能被认为是全局的。它甚至可以在程序执行期间更改(不同的函数可能会将全局指针重置到它们想要的任何位置)@Philippe:.数据段也不仅仅是.EXE。全局内存永远不会在堆栈上分配。堆栈仅用于局部变量和参数。当函数返回时,堆栈变量被“销毁”。通过编辑boot.ini文件,我们可以将虚拟内存扩展到3GB。像wise一样,内存段是否有任何设置?这将是毫无意义的,因为静态分配内存的大小永远不会改变malloced缓冲区空间与全局变量无关。只有指针是全局的。请不要再把人们弄糊涂了。哦,别傻了。提问者显然不清楚是什么原因,所以我写了一个答案,旨在提高他的理解。另外,全局变量和静态变量(在函数中)之间有什么区别。他们必须为项目的生命而活……同意,但他们之间存在差异accessibility@dspinozzi:在main()之前调用全局变量的构造函数,但在第一次调用函数时调用静态变量的构造函数。这两种类型的变量通常存储在内存的相同部分——我认为GCC将它们放在.data部分。它说“在堆上分配”,这是非常正确的。除非这个问题被标记为“新手”或“初学者”,否则这应该足以提醒我们正在发生什么。@Don:不。全局对象是指针,而不是它指向的内存。您可以按自己的方式处理内存。也不是为了一直跑下去。你甚至可以把它指向stack somet