C/C++ 内存布局、程序构建与静态库动态库
从内存区域划分(.text / .rodata / .data / .bss / 栈 / 堆)讲到构建四阶段(预处理 → 编译 → 汇编 → 链接),再到静态库与动态库的创建、链接行为差异,末尾汇总易错点。 一、内存布局在构建阶段就确定 Determined at Build Time:.text / .rodata / .data / .bss 的内存布局、大小在编译链接构建阶段就确定,不是程序跑起来才决定。这几段都属于 static lifetime 静态生命周期,由编译器自动管理分配与释放,程序员不能手动干预申请释放。 按数据类型、生命周期和作用域,C/C++ 程序的内存通常划分为五大区域:代码区、全局/静态存储区、栈区、堆区、常量区。其中代码区对应 .text,常量区对应 .rodata,全局/静态存储区对应 .data 与 .bss,栈区与堆区则在运行时分配。 1. .text 代码段(文本段 / 代码区) 存储内容:编译之后的机器指令(machine code),即写出的函数、if/for 循环、main 函数等翻译成 CPU 能执行的指令。所有的函数定义、控制结构都会被转换成机器指令存放在这里。 大小:Fixed size,构建阶段确定大小。 权限:Read-only 只读,防止运行时篡改程序指令。这部分内存是共享的,在程序执行期间不会改变。 生命周期:静态生命周期,进程整个运行期间都存在,进程退出由操作系统回收。 管理:完全由编译器、链接器自动管理,程序员没有 API 手动分配释放本段内存。 编译时,main、func 等函数的代码被转换成机器指令存放在可执行文件的代码段中(此时还在磁盘上的可执行文件里);程序运行时,操作系统把这些指令加载到内存的代码段,CPU 再从内存的代码段中读取并执行。 2. .rodata 只读数据段(常量区) 存储内容:初始化后的常量,比如字符串字面量 "hello world"、const char *p = "abc" 这类常量字符串,以及全局 const 常量。 权限:只读 Read-only,程序运行不能修改,写操作会触发段错误。这部分内存同样通常在程序执行期间不会改变。 区分:const int a = 10; 声明在全局放 rodata;局部 const 变量本质还是在栈上。 ...
豫公网安备41108202000982号