struct 和 class 在内存布局、性能、对齐、大小等方面完全一致,差异仅在于默认访问权限;真正影响性能的是成员类型、顺序、特殊成员函数定义及是否 trivially copyable。

struct 和 class 在内存布局上完全一致
只要不涉及虚函数、多重继承或虚继承,struct 和 class 的对象大小、成员偏移、对齐方式一模一样。编译器不因关键字不同而改变内存布局——这是 C++ 标准明确要求的。
验证方法很简单:用 sizeof 和 offsetof 对比两者的输出,例如:
struct S { char a; int b; };
class C { char a; int b; };
static_assert(sizeof(S) == sizeof(C));
static_assert(offsetof(S, b) == offsetof(C, b));
常见误判来源:有人看到 struct 常用于 POD 类型,就以为它“更轻量”,其实只是约定俗成的用法,不是语言机制。
默认访问权限差异不影响运行时性能
struct 默认 public,class 默认 private,这只是编译期的访问控制检查,生成的汇编代码、vtable(如果存在)、内存访问指令毫无区别。
立即学习“C++免费学习笔记(深入)”;
真正影响性能的是你是否启用了访问检查(比如调试模式下某些编译器会插桩),但那是工具链行为,不是 struct/class 本身的差异。
容易踩的坑:
- 误以为把
class改成struct能“去掉封装开销”——没有这种开销 - 在模板元编程中依赖
is_standard_layout_v<T>时,只和成员布局有关,和用struct还是class声明无关 - 跨 DLL 边界传递对象时,若两边声明不一致(比如一边用
struct一边用class),可能触发 ODR 违规,但这属于 ABI 兼容问题,不是性能问题
内存对齐由成员类型和顺序决定,与关键字无关
对齐规则看的是成员声明顺序、类型大小、编译器对齐策略(如 #pragma pack 或 alignas),不是 struct 还是 class。
例如以下两者对齐行为完全相同:
struct X { char a; double b; };
class Y { char a; double b; };
实际填充取决于目标平台(如 x86_64 下 double 通常要求 8 字节对齐),编译器会按需插入 padding。你可以用 alignof(X) 和 alignof(Y) 验证它们返回相同值。
关键提醒:手动调整成员顺序能显著减少 padding(比如把 char、short 集中放在后面),这个优化对 struct 和 class 同样有效,也同等重要。
唯一真实影响性能的场景:隐式生成的特殊成员函数
当类含非 POD 成员(如 std::string、std::vector)时,struct 和 class 都会隐式生成构造/析构/拷贝等函数,但它们的行为一致,性能无差别。
真正要注意的是:如果你写了自定义构造函数,又没显式定义移动构造/移动赋值,且类含大对象(如大数组、堆内存指针),那么默认生成的拷贝操作可能引发深拷贝——这跟用 struct 还是 class 完全无关,只跟你是否提供移动语义有关。
容易被忽略的点:
- 即使声明为
struct,只要加了用户定义的构造函数,它就不再是 trivially copyable(除非显式标记= default) - 用
memcpy直接复制非 trivial 类型是未定义行为,不管它是struct还是class - 序列化或 memcpy 优化前,必须确认
std::is_trivially_copyable_v<T>为 true,而不是看它是不是struct



















