C C++内存分布

发布时间:2026/9/4 18:46:45
C C++内存分布 .textCode SectionStore Machine CodeFixed SizeRead-only.bssUninitialized statics/globalsZero-initialized statics/globals.dataNon-zero initialized statics/globalsRead/write for .data.rodataInitialized const statics/globalsRead-only for .rodata代码示例const 与 .rodata 的对应关系#include iostream #include cstddef // 为了 offsetof // 1. 全局 const只读常量 const int global_const 100; // 全局 const → .rodata const char* global_str hello; // 指针在 .data字符串 hello 在 .rodata // 2. 字符串字面量各种形式 const char* str1 Hello World; // 字符串在 .rodata const char* str2 Hello World; // 编译器可能合并指向同一个 .rodata 地址 const char* str3 你好世界; // UTF-8 编码也在 .rodata const char* str4 A; // 单个字符的字符串也在 .rodata const char* str5 ; // 空字符串也有一个字节 \0 在 .rodata // 3. 全局常量数组 const int const_array[5] {1, 2, 3, 4, 5}; // 整个数组在 .rodata // 4. 全局 const 字符串数组 const char* const color_names[] {Red, Green, Blue}; // 指针数组在 .data三个字符串在 .rodata // 5. switch-case 跳转表编译器生成 // 编译器可能为 switch 生成跳转表放在 .rodata但用户无法直接命名 // 6. 局部 const 变量注意不在 .rodata // void func() { // const int local_const 200; // 这是一个坑它在栈上不在 .rodata // } // 7. 函数内字符串字面量确实在 .rodata void print_message() { const char* msg This is a message from func; // 字符串在 .rodata指针 msg 在栈上 std::cout msg std::endl; } // 8. 静态局部 const也在 .rodata void func_with_static_const() { static const int static_local_const 999; // 静态局部 const → .rodata或 .data取决于编译器 static const char* static_local_str static string; // 字符串在 .rodata std::cout static_local_const static_local_str std::endl; } // 9. 全局 constexpr编译期常量通常在 .rodata constexpr int compile_time_const 42; // constexpr 全局常量 → .rodata // 10. 类静态 const 成员如果 ODR 使用 class MyClass { public: static const int class_static_const 123; // 静态常量ODR 使用时在 .rodata const int class_nonstatic_const 456; // 非静态 const 成员 → 跟随对象栈/堆/静态区 }; // 如果我们要取静态常量的地址必须提供定义否则链接错误 // 这里为了演示强制分配内存放在 .rodata const int MyClass::class_static_const; int main() { // 使用所有变量防止优化 std::cout 各变量存储位置验证 std::endl; std::cout 1. 全局 const: global_const (地址: (void*)global_const ) std::endl; std::cout 2. 全局指针: global_str (指针地址: (void*)global_str , 字符串地址: (void*)global_str ) std::endl; std::cout 3. 字符串字面量 str1: str1 (地址: (void*)str1 ) std::endl; std::cout 4. 全局 const 数组: const_array[2] (地址: (void*)const_array ) std::endl; std::cout 5. 全局 const 字符串数组: color_names[1] (数组地址: (void*)color_names , 字符串地址: (void*)color_names[1] ) std::endl; print_message(); func_with_static_const(); std::cout 6. constexpr: compile_time_const (地址: (void*)compile_time_const ) std::endl; // 新增部分类内两个 const 成员的演示 MyClass obj; // 栈对象 MyClass* heap_obj new MyClass(); // 堆对象 std::cout \n 类成员验证 std::endl; std::cout 7. 静态 const 成员 (class_static_const): MyClass::class_static_const (地址: (void*)MyClass::class_static_const ) std::endl; std::cout 8. 非静态 const 成员 (obj.class_nonstatic_const): obj.class_nonstatic_const (地址: (void*)obj.class_nonstatic_const ) std::endl; std::cout 9. 非静态 const 成员 (heap_obj-class_nonstatic_const): heap_obj-class_nonstatic_const (地址: (void*)heap_obj-class_nonstatic_const ) std::endl; delete heap_obj; std::cout \n结论 std::endl; std::cout - 静态 const 成员有 static属于类静态存储期地址在 .rodata 段。 std::endl; std::cout - 非静态 const 成员无 static属于对象存储在对象的栈/堆内存中不是全局只读区。 std::endl; return 0; }