问题 C ++:POD Pros \ Cons


  • 什么是 利弊 的 运用 普通旧数据(POD) C ++中的结构\类
  • 在什么情况下应该更喜欢使用 他们超过非POD?
  • 特别, POD在工作时有优势 与序列化框架? 也许在跨平台工作时 和跨语言?

4750
2017-12-24 07:38


起源



答案:


POD与常量相结合有一个优点。

如果声明/定义一个常量并为其使用POD类型,则整个POD将被放入可执行文件/库的(常量)数据部分,并在加载后可用。

如果使用非POD,则构造函数必须运行以初始化它。由于在C ++中运行静态类的构造函数的顺序是未定义的,因此无法从静态B的构造函数或从静态B的构造函数中调用的任何代码访问静态A.

因此在这种情况下使用POD是安全的。


6
2017-12-24 09:00



“在C ++中运行静态对象构造函数的顺序是未定义的” - 如果它们位于不同的翻译单元中。 - Steve Jessop
@Steve:是的......当然。 - mmmmmmmm


答案:


POD与常量相结合有一个优点。

如果声明/定义一个常量并为其使用POD类型,则整个POD将被放入可执行文件/库的(常量)数据部分,并在加载后可用。

如果使用非POD,则构造函数必须运行以初始化它。由于在C ++中运行静态类的构造函数的顺序是未定义的,因此无法从静态B的构造函数或从静态B的构造函数中调用的任何代码访问静态A.

因此在这种情况下使用POD是安全的。


6
2017-12-24 09:00



“在C ++中运行静态对象构造函数的顺序是未定义的” - 如果它们位于不同的翻译单元中。 - Steve Jessop
@Steve:是的......当然。 - mmmmmmmm


如果你有大量的小物件,确保那些物体是POD可以是一个巨大的优势。

  1. 你可以使用calloc()或malloc()中的一大块,为你节省大量的构造函数。
  2. 对于持久性,您可以使用fwrite()和fread()整个对象来提高速度,而不是一次一个地流出对象。

缺点是,您必须保持灵活处理代码中的非OOP POD。 POD是旧式C代码的后备,您可以在其中了解并关注数据的布局。当布局定义明确时,您可以通过处理大块内存而不是大量小块进行优化。

请注意,我上面描述的内容适用于简单布局的结构。换句话说,如果你在这种类型上调用type_trait的std :: is_trivially_copyable(),你就会得到真的。 POD的要求实际上甚至比普通可复制结构的要求更强。所以我上面刚刚描述的内容适用于所有POD甚至一些碰巧可以轻易处理的非POD。


6
2017-10-15 18:45





POD可以在C接口中使用,这意味着您可以使用C ++编写库,但使用C接口可以获得优势。

缺点是你不能使用构造函数将初始化的负担放在类型本身上 - 用户代码必须要处理它。


3
2017-12-24 08:06





豆荚有一些微妙的优势。 我不知道任何可移植的方法来计算所需的内存大小 对于new []运算符,如果数组元素是非pod, 因此,对于这样的数组使用安全放置new []运算符是很困难的。 如果nonpod结构有析构函数,new []需要额外的空间来存储数组大小,但是这个额外的大小是依赖于实现的(althogh通常是sizeof(size_t)+(可能)一些填充以提供正确的对齐)


0
2017-12-24 12:19