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>

相关:cpp对象内存模型cpp类型萃取CandCpp底层知识