gpt4 book ai didi

c++ - C/C++ 程序的内存布局如何?

转载 作者:IT老高 更新时间:2023-10-28 22:59:35 26 4
gpt4 key购买 nike

我知道有堆栈、堆、代码和数据等部分。堆栈/堆它们是否使用相同的内存部分,因为它们可以独立增长?这个代码部分是什么?当我有一个函数时,它是堆栈的一部分还是代码部分的一部分?还有这个初始化/未初始化的数据段是什么?

是否有可用的只读内存部分?当我有一个 const 变量时,实际发生的是编译器将内存部分标记为只读还是放入只读内存部分。

静态数据保存在哪里?全局数据保存在哪里?

有什么好的引用资料/文章吗?

我认为内存部分和布局是独立于操作系统的,它更多地与编译器有关。 Stack, Heap, Code, Data [Initialized, Uninitialized] 段不是在所有操作系统中都出现吗?当有一个静态数据时,编译器已经理解它是静态的,接下来会发生什么,它会做什么?管理程序的是编译器,它应该知道该做什么对吗?所有编译器不应该遵循共同的标准吗?

最佳答案

关于 C++ 内存布局实际上几乎没有什么是确定的。但是,大多数现代操作系统都使用类似的系统,并且根据权限将各个部分分开。

代码具有执行权限。其他部分没有。在 Windows 应用程序中,您不能只是将一些 native 代码放在堆栈上并执行。 Linux 提供相同的功能 - 它采用 x86 架构。

数据是作为结果的一部分(.exe 等)但无法写入的数据。本节基本上是文字所在的地方。本节的只读权限。

这两个段是生成文件的一部分。堆栈和堆是运行时分配的,而不是映射到硬盘上。

堆栈本质上是一个大(1MB 左右,许多编译器为其提供设置)堆分配。编译器为您管理它。

堆内存是操作系统通过某些进程返回给您的内存。通常,堆是指向空闲内存块及其大小的指针的堆(数据结构)。当你请求一个时,它就会给你。这里有读写权限,但没有执行权限。

有只读存储器(ROM)。但是,这只是数据部分。您不能在运行时更改它。当你创建一个 const 变量时,它在内存中没有什么特别的事情发生。所发生的只是编译器只会在其上创建某些指令。而已。 x86 没有关于 const 的知识或概念——这一切都在编译器中。

关于c++ - C/C++ 程序的内存布局如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3080375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com