c++ - 琐碎对象和非琐碎对象有什么区别
问题描述
我实际上不确定了解琐碎对象和非琐碎对象之间的区别。例如,这里说一个微不足道的对象:
- 占用一个连续的内存区域
- 不包含用户提供的构造函数/运算符/析构函数。
但是对象会自动对齐内存中的数据吗?如果它满足这两点但有方法怎么办?有什么与POD有关的吗?
“琐碎”对我来说听起来像是可以像简单类型一样使用的东西。但我想它比这更复杂。
解决方案
可以在此处找到平凡类型的官方定义。
简单来说,平凡类型要么是基本类型(int
、float
等),要么是仅由其他平凡类型组成的类型,并且没有此处列出的任何特殊成员函数。其他成员函数不起作用。
琐碎的一点是该类型可以完全像基本类型一样对待,因为该类型的对象可以被复制和移动,memcpy
并且可以在不做任何事情的情况下构造破坏。因此,琐碎性要求类型本质上仅由基本类型组成。这就是使复制、移动、构造和销毁操作与普通类型的定义相关的原因。其他成员函数不会发挥作用,就像您可以编写void fn( int*, OtherArgs... )
而不影响 anint
是否平凡一样,因为您可以将成员函数T
视为本质上是自由函数,具有ReturnType member_function( T*, OtherArgs... )
编译器让您使用语法调用的签名a.member_function( other_args... )
.
至于对齐,它根本就不是那么相关,因为它已经为您处理好了。由于强大的静态类型系统,编译器知道它正在使用的类型的对齐方式。
正如您在此处看到的,所有 POD 类型都是微不足道的。
推荐阅读
- django - 如何保存 pytest-django 夹具生成的测试数据
- angular - Angular8:嵌套延迟加载不适用于cordova 9
- sql - 计算有多少日期落入间隔
- jenkins - 使用 Jenkins 在 cppcheck 中重复相同的文件、行和错误
- python - 如何水平打印列表项?
- python - 如何在 django 中添加倒数计时器作为用户字段?
- swift - Swift 使 containerStackView 可滚动
- snowflake-cloud-data-platform - 从外部来源使用 dbt 查询
- python - 有没有什么方法可以使用 pandas(不是 groupby)按条件将多行组合成一个?
- oracle-sqldeveloper - Oracle SQL Developer 17.2 说正在执行脚本,但没有出现结果