平凡和非平凡的对象有什么区别

时间:2020-04-20 18:15:41

标签: c++ c++11

我实际上不确定要了解琐碎对象与非琐碎对象之间的区别。例如,据说here是一个琐碎的对象:

  • 占用连续的内存区域
  • 不包含用户提供的构造函数/运算符/析构函数。

但是对象是否会自动对齐内存中的数据?如果它同时满足了上述两点但又有方法该怎么办?有什么与POD相关的东西吗?

在我看来,“琐碎的”听起来像是一种可以用作简单类型的方式。但是我想这要复杂得多。

1 个答案:

答案 0 :(得分:3)

琐碎类型的正式定义可以在here中找到。

简单来说,琐碎类型要么是基本类型(intfloat等),要么是仅由其他琐碎类型组成的类型,并且没有列出任何特殊的成员函数here。其他成员函数不起作用。

琐碎的一点是,可以将类型完全像基本类型一样对待,因为可以使用memcpy复制和移动类型的对象,并且无需执行任何操作即可销毁该对象。因此,琐碎性要求一种类型基本上仅由基本类型组成。这就是使复制,移动,构造和销毁操作与琐碎类型的定义相关的原因。其他成员函数不会像您可以写void fn( int*, OtherArgs... )而不会影响int琐碎一样发挥琐碎作用,因为您可以将T的成员函数视为本质上是带有签名ReturnType member_function( T*, OtherArgs... )的自由函数,编译器让您使用语法a.member_function( other_args... )调用。

至于对齐,它根本就没有那么重要,因为它已经为您照顾好了。借助强大的静态类型系统,编译器知道其使用的类型的对齐方式。

您会看到here,所有POD类型都是微不足道的。