2
struct A
{
  int i;
};

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

Hi,all

I know "POD means Plain Old Data type which by definition cannot have user-defined constructor". But I can't understand why this rule is effective when "definition have an user-defined default-con".

There is no difference of their memory layout.Why type A is POD,but not B?

4

3 回答 3

8

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

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

于 2013-07-17T09:02:58.723 回答
3

POD的概念已分为琐碎和标准布局概念。您可以通过标准类型特征查询这些属性。

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
于 2013-07-17T08:51:18.557 回答
1

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

特别是在初始化 POD 结构时,编译器只需要保留适当大小的内存即可,无需担心初始化。初始化可以由程序员显式请求,但它永远不会像用户定义的构造函数那样隐式发生。

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

于 2013-07-17T09:02:37.557 回答