cpp对象模型与内存布局

内容简介

对象模型讨论 C++ 对象在内存中大致如何组织:成员变量、对齐填充、空对象、虚函数、虚表指针、继承布局等。

这不是日常开发主线。它主要用于理解性能、ABI、二进制接口、序列化和一些看似奇怪的 sizeof 结果。

关键点

  • 非静态成员变量通常占对象空间。
  • 成员函数不存放在每个对象内部。
  • 空对象也至少占 1 字节,用来保证不同对象地址不同。
  • 对象大小会受对齐和填充影响。
  • 有虚函数的对象通常会引入虚表指针,具体布局由编译器和 ABI 决定。

示例

struct A {
    char c;
    int i;
};
 
// sizeof(A) 通常大于 sizeof(char) + sizeof(int)

多出来的空间通常来自对齐填充。

不要误用

// 不要依赖对象内存布局做跨平台文件格式

只要类型包含指针、虚函数、标准库对象或平台相关布局,直接按字节保存都很危险。

注意事项

  • C++ 标准不保证所有编译器对象布局完全一致。
  • 讨论虚表、vptr 时要记住它们是常见实现,不是适合新手依赖的语法规则。
  • 需要稳定二进制格式时,应设计明确的序列化格式。

相关:cpp对象内存模型cpp多态cpp平凡对象CandCpp底层知识