我知道有堆栈,堆,代码和数据的部分.堆栈/堆它们是否使用相同的内存区段,因为它们可以独立增长?
这段代码是什么?当我有一个功能是堆栈的一部分或代码部分?
这也是这个初始化/未初始化的数据段?
这段代码是什么?当我有一个功能是堆栈的一部分或代码部分?
这也是这个初始化/未初始化的数据段?
是否只有可用的内存部分?当我有一个const变量时,实际发生的是编译器将内存部分标记为只读或将其放入只读存储器部分.
静态数据保存在哪里?
全球数据保留在哪里?
任何好的参考文献/文章相同?
我认为内存部分和布局是独立于操作系统的,它与编译器有关.堆栈,代码,数据[初始化,未初始化]段都发生在所有的操作系统中?当有静态数据时,编译器已经明白它是静态的,接下来会怎么做?正在管理程序的编译器,它应该知道该怎么做?所有的编译者都不应该遵循共同的标准?
解决方法
C内存布局实际上确实很少.然而,大多数现代操作系统使用的是一个类似的系统,而这些段是基于权限分隔的.
代码具有执行权限.其他细分没有.在Windows应用程序中,您不能将一些本机代码放在堆栈上并执行. Linux提供了相同的功能 – 它在x86架构中.
数据是结果(.exe等)的一部分但不能写入的数据.这部分基本上是文字去的地方.只有在本部分阅读权限.
这两个段是生成的文件的一部分.堆栈和堆是运行时分配的,而不是映射掉硬盘驱动器.
堆栈本质上是一个,大(1MB左右,很多编译器提供了一个设置)堆分配.编译器为您管理它.
堆内存是操作系统通过一些进程返回给你的内存.通常,堆是指向可用内存块及其大小的指针的堆(数据结构).当你请求一个,它是给你的.在这里读写权限,但不执行.
有只读存储器(ROM).但是,这只是Data部分.您不能在运行时更改它.当你做一个const变量时,内存里没有什么特别的事情.所有这些都是编译器只会在其上创建某些指令.而已. x86没有任何知识或概念,它们都在编译器中.