struct A
{
int i;
};
struct B
{
B(){}
int i;
}
您好,所有
我知道“POD意味着普通旧数据类型,根据定义,它不能具有用户定义的构造函数”。 但是,当“定义具有用户定义的default-con”时,我无法理解为什么这条规则有效。
它们的内存布局没有区别。为什么A型是POD,而不是B?
答案 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";
}
true true true
false false true
true true true
答案 2 :(得分:1)
POD允许编译器进行某些优化。根据经验,如果允许编译器以与C编译器相同的方式处理struct
,则类型为POD。
特别是,在初始化POD结构时,编译器只需要保留相应 size 的内存,不需要担心初始化。程序员可以明确地请求初始化,但它不会像用户定义的构造函数那样隐式发生。
例如,用户定义的默认构造函数可能要求将数据初始化为0.通常,默认构造函数甚至可能具有编译器需要考虑的任意副作用。