cpp对象模型与内存布局
内容简介
对象模型讨论 C++ 对象在内存中大致如何组织:成员变量、对齐填充、空对象、虚函数、虚表指针、继承布局等。
这不是日常开发主线。它主要用于理解性能、ABI、二进制接口、序列化和一些看似奇怪的 sizeof 结果。
关键点
- 非静态成员变量通常占对象空间。
- 成员函数不存放在每个对象内部。
- 空对象也至少占 1 字节,用来保证不同对象地址不同。
- 对象大小会受对齐和填充影响。
- 有虚函数的对象通常会引入虚表指针,具体布局由编译器和 ABI 决定。
示例
struct A {
char c;
int i;
};
// sizeof(A) 通常大于 sizeof(char) + sizeof(int)多出来的空间通常来自对齐填充。
不要误用
// 不要依赖对象内存布局做跨平台文件格式只要类型包含指针、虚函数、标准库对象或平台相关布局,直接按字节保存都很危险。
注意事项
- C++ 标准不保证所有编译器对象布局完全一致。
- 讨论虚表、vptr 时要记住它们是常见实现,不是适合新手依赖的语法规则。
- 需要稳定二进制格式时,应设计明确的序列化格式。