Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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++ c+中的内存分配+;_C++_Memory - Fatal编程技术网

C++ c+中的内存分配+;

C++ c+中的内存分配+;,c++,memory,C++,Memory,可能重复: 大家好 我目前正在准备面试,我经常看到这样的问题,比如“静态”变量在哪里,或者“局部”/“全局”变量存储在哪里,我完全感到困惑 我知道有两种内存:堆栈和堆。除此之外,还有其他类型的内存存储不同类型的变量。在一些地方,我甚至读到一些关于“数据段”的东西,但我不确定这些东西是如何相互映射的。任何人都可以为我提供不同类型的内存的链接/解释,以及所有不同类型的变量被存储,最好与C++相关。 谢谢, Chander简单地说,基本上有三个主要存储区域需要关注: 全局数据——堆栈或堆外的单个静态

可能重复:

大家好

我目前正在准备面试,我经常看到这样的问题,比如“静态”变量在哪里,或者“局部”/“全局”变量存储在哪里,我完全感到困惑

我知道有两种内存:堆栈和堆。除此之外,还有其他类型的内存存储不同类型的变量。在一些地方,我甚至读到一些关于“数据段”的东西,但我不确定这些东西是如何相互映射的。任何人都可以为我提供不同类型的内存的链接/解释,以及所有不同类型的变量被存储,最好与C++相关。 谢谢,
Chander

简单地说,基本上有三个主要存储区域需要关注:

  • 全局数据——堆栈或堆外的单个静态内存位置。这些变量声明为非任何函数的局部变量。(C/C++“static”关键字的明显区别实际上就是程序的哪些部分知道全局变量的名称。)

  • 堆栈数据——动态的,但通过函数调用推送和弹出

  • 堆数据——new/malloc返回的内容,真正是动态的,并且内存会一直保持到delete/free,而不是函数退出时


  • 还有第三种存储,称为静态存储。本质上,这是可执行文件的运行时内存映像中数据项的存储。它不能被分配或释放,它的生命周期本质上就是程序的生命周期。在C++中,类静态变量在全局区域中存储,如全局变量。
    在过去,一些处理器架构(特别是x86)使用分段寻址。在这种情况下,静态数据将驻留在数据段中。为了访问静态数据,您使用了一个相对于段基址的地址,该地址位于DS或ES寄存器中。然而,至少从20世纪90年代中期开始,操作系统体系结构就转向了扁平内存模式,在这种模式下,所有的内存段联合起来,覆盖整个内存空间。所以数据段不应该出现在任何当前的面试问题中。

    堆栈和堆不是两种内存。他们只是同一个组织的不同部分。此外,维基百科也有利于学习这种东西,不过,最好是让C++书保留知识(通过编写一个使用静态变量和动态内存分配的程序)。请参阅这个问题的答案:还有程序数据,如字符串文字,在一些操作系统中,这些代码的存储方式可能相当复杂。此外,内存的文本部分存储了指向该区域的代码函数指针。这是一个很好的、清晰的答案。Sam,他提到他的答案是关于一个人应该关注的存储区域。我怀疑大多数人是否需要了解记忆中的文本部分。