cpp平凡对象
内容简介
平凡对象通常指构造、拷贝、移动、析构都很简单,编译器可以用接近 C 结构体的方式处理的对象。相关概念包括 trivial type、trivially copyable、standard-layout。
基础阶段不需要背标准定义,先理解它解决的问题:哪些类型可以被低成本复制、放进二进制缓冲区、和 C 接口更自然地交互。
直观例子
struct Point {
int x;
int y;
};这种类型没有自定义构造、析构,也没有复杂资源所有权,通常接近平凡类型。
非平凡例子
#include <string>
struct Person {
std::string name;
int age;
};std::string 内部管理资源,不能把 Person 当成一段普通字节随意复制。
为什么重要
- 和 C 接口传递数据时更容易。
- 做二进制序列化时需要知道对象能不能直接按字节处理。
- 底层优化、内存布局、对象模型讨论经常会提到。
std::is_trivially_copyable等类型萃取会用到这些概念。
易错点
Person p{"Alice", 18};
// 不要把包含 std::string 的对象直接 fwrite 成二进制并期望跨平台恢复这保存的可能只是内部指针或实现细节,不是字符串真实语义。
注意事项
- “平凡”不是“简单业务对象”的同义词,它是 C++ 标准里的类型性质。
- 有自定义析构函数、虚函数、复杂成员时,类型通常不再平凡。
- 判断类型性质时,可以使用
<type_traits>。