C++:1.内存模型划分
目录1.内存模型逻辑划分2.内存模型对应磁盘文件说明3.程序加载过程1.内存模型逻辑划分在C中虚拟内存通常会被划分成5个区域分别是堆、栈、全局/静态存储区、常量存储区、代码区。下面简单介绍下。1.堆heap在程序运行期间使用用来存储动态分配的变量。C语言用malloc开辟堆空间、C语言用new开辟堆空间。堆释放原则是谁开辟谁释放。如果不释放就会造成内存泄漏常见的OOM报错就是这种。如果没有释放在程序结束后操作系统会回收堆空间内存。2.栈stack栈是由编译器自动分配和释放不需要程序员自行维护。像局部变量、函数传参都是存储在栈区。函数结束后局部变量自动释放。栈空间远小于堆一般只有10MB左右。3.全局静态存储区.bss段和.data段有些叫全局区有些叫静态区有些甚至不在区分这么细了。其实叫什么无所谓这两个都是在同一块内存中。存储的都是全局变量和静态变量。只是一个存储已经初始化的变量一个存储未初始化的变量。.bss段存放未初始化的全局变量和静态变量。如 static int aa;.data段存放初始化了的全局变量和静态变量。如 static int aa 100;对于未初始化的全局变量和静态变量程序启动后编译器会默认赋予初始值。是int类型就赋予0字符串类型就赋予指针类型就赋予nullptr。4.常量存储区.rodata段用来存储字符串常量、const修饰的常量。不能被修改。如const char* str hello world; // hello world 在常量区const int MAX_NUM 1000; // 全局const常量5.代码区.text段代码段也被称为文本区或只读区存放程序的二进制代码代码段是只读的可以被多个进程共享。2.内存模型对应磁盘文件说明以Windows举例程序编译好后我们实际得到的是一个exe文件。里面存放的就是上面各个段的二进制内容。不过需要注意的是.text/.rodata/.data/.bss这些内容会被打包到exe中但堆和栈不会。他们不属于 exe 文件内容是程序跑起来后才创建的内存。3.程序加载过程这一步就是第2步的反向过程。操作系统加载exe时会把文件内部的段映射到进程虚拟内存五大分区中。其中exe中的.text内容映射到内存代码区中只读。exe中的.rodata内容映射到内存常量存储区中只读。exe中的.data和.bss内容映射到内存全局静态存储区中其中.bss在运行时会被清空这也是为啥没有赋值的全局变量、静态变量也会有默认值而不是垃圾值的原因。可读写。堆、栈exe文件中不存在是程序启动后操作系统自行创建的。