如何理解这个POD规则

时间:2013-07-17 08:28:49

标签: c++ c++11 constructor typetraits pod

struct A
{
  int i;
};

struct B
{
 B(){} 
 int i;
}

您好,所有

我知道“POD意味着普通旧数据类型,根据定义,它不能具有用户定义的构造函数”。 但是,当“定义具有用户定义的default-con”时,我无法理解为什么这条规则有效。

它们的内存布局没有区别。为什么A型是POD,而不是B?

3 个答案:

答案 0 :(得分:8)

原因很简单。一旦你定义了一个构造函数(任何 构造函数),该语言假定该类需要一些 一种初始化;只是复制其图像中的位 不足以创建新实例。其中之一 POD的重要特征是它们可以被记忆化。

总之,编译器查看类的内容 确定它是否是POD(除了看是否有任何 成员是PODS)。它会考虑您是否定义了任何内容 特殊的,可能会影响初始化,分配或 破坏这些成员。

答案 1 :(得分:3)

POD has been split into trivial and standardy-layout概念的概念。您可以通过标准类型特征查询这些属性。

B不是POD,因为它不是微不足道的。这不是一件容易的事,因为它有一个用户提供的默认构造函数。省略或使用新的C ++ 11 =default语法。

#include <type_traits>
#include <iostream>
#include <ios>

struct A
{
  int i;
};

struct B
{
 B(){} 
 int i;
};

struct C
{
 C() = default;
 int i;
};

int main()
{
    std::cout << std::boolalpha << std::is_pod<A>::value << " ";
    std::cout << std::boolalpha << std::is_trivial<A>::value << " ";
    std::cout << std::boolalpha << std::is_standard_layout<A>::value << "\n";

    std::cout << std::boolalpha << std::is_pod<B>::value << " ";
    std::cout << std::boolalpha << std::is_trivial<B>::value << " ";
    std::cout << std::boolalpha << std::is_standard_layout<B>::value << "\n";

    std::cout << std::boolalpha << std::is_pod<C>::value << " ";
    std::cout << std::boolalpha << std::is_trivial<C>::value << " ";
    std::cout << std::boolalpha << std::is_standard_layout<C>::value << "\n";
}

Online output

true true true
false false true
true true true

答案 2 :(得分:1)

POD允许编译器进行某些优化。根据经验,如果允许编译器以与C编译器相同的方式处理struct,则类型为POD。

特别是,在初始化POD结构时,编译器只需要保留相应 size 的内存,不需要担心初始化。程序员可以明确地请求初始化,但它不会像用户定义的构造函数那样隐式发生。

例如,用户定义的默认构造函数可能要求将数据初始化为0.通常,默认构造函数甚至可能具有编译器需要考虑的任意副作用