我遇到过几次POD-type这个术语。 这是什么意思?
当前回答
据我所知,POD (PlainOldData)只是一个原始数据-它不需要:
要被建造, 被毁灭, 拥有自定义操作符。 必须没有虚函数, 并且不能重写操作符。
如何检查某物是否是POD?有一个结构体叫做std::is_pod:
namespace std {
// Could use is_standard_layout && is_trivial instead of the builtin.
template<typename _Tp>
struct is_pod
: public integral_constant<bool, __is_pod(_Tp)>
{ };
}
(来自头文件type_traits)
参考:
http://en.cppreference.com/w/cpp/types/is_pod http://en.wikipedia.org/wiki/Plain_old_data_structure http://en.wikipedia.org/wiki/Plain_Old_C++_Object 文件type_traits
其他回答
普通旧数据
简而言之,它是所有内置数据类型(例如int、char、float、long、unsigned char、double等)和POD数据的所有聚合。是的,这是递归定义。;)
更清楚地说,POD就是我们所说的“结构体”:仅存储数据的单元或单元组。
为什么我们需要区分POD和非POD呢?
c++最初是作为C的扩展而诞生的。虽然现代c++不再是严格意义上的C的超集,但人们仍然期望两者之间具有高度的兼容性。一个平台的“C ABI”还经常充当该平台上其他语言的事实上的标准中介语言ABI。
粗略地说,POD类型是一种与C兼容的类型,也许同样重要的是与某些ABI优化兼容。
为了与C兼容,我们需要满足两个约束条件。
布局必须与对应的C类型保持一致。 该类型必须以与相应的C类型相同的方式传递给函数并从函数返回。
某些c++特性与此不兼容。
虚方法要求编译器插入一个或多个指向虚方法表的指针,这在C语言中是不存在的。
用户定义的复制构造函数、移动构造函数、复制赋值和析构函数对参数传递和返回都有影响。许多C abi在寄存器中传递和返回小参数,但是传递给用户定义的构造函数/赋值/析构函数的引用只能处理内存位置。
因此,有必要定义哪些类型可以“兼容C”,哪些类型不能。c++ 03在这方面有点过于严格,任何用户定义的构造函数都将禁用内置构造函数,任何试图将它们添加回来的尝试都将导致它们是用户定义的,因此类型为非pod。c++ 11开放了很多东西,允许用户重新引入内置构造函数。
POD的概念和类型特征std::is_pod将在c++ 20中被弃用。有关进一步信息,请参阅此问题。
POD代表普通旧数据——也就是说,一个没有构造函数、析构函数和虚成员函数的类(无论是用关键字struct还是用关键字class定义的)。维基百科关于POD的文章更详细一些,并将其定义为:
c++中的普通旧数据结构是一个聚合类,它只包含PODS作为成员,没有用户定义的析构函数,没有用户定义的复制赋值操作符,也没有指针到成员类型的非静态成员。
更多的细节可以在c++ 98/03的答案中找到。c++ 11改变了围绕POD的规则,极大地放松了它们,因此需要在这里进行后续回答。
据我所知,POD (PlainOldData)只是一个原始数据-它不需要:
要被建造, 被毁灭, 拥有自定义操作符。 必须没有虚函数, 并且不能重写操作符。
如何检查某物是否是POD?有一个结构体叫做std::is_pod:
namespace std {
// Could use is_standard_layout && is_trivial instead of the builtin.
template<typename _Tp>
struct is_pod
: public integral_constant<bool, __is_pod(_Tp)>
{ };
}
(来自头文件type_traits)
参考:
http://en.cppreference.com/w/cpp/types/is_pod http://en.wikipedia.org/wiki/Plain_old_data_structure http://en.wikipedia.org/wiki/Plain_Old_C++_Object 文件type_traits
推荐文章
- 我如何在c++中创建一个随机的字母数字字符串?
- c++中的atan和atan2有什么区别?
- 现代c++能让你免费获得性能吗?
- 一门语言是如何自我扩展的?
- 如何使用cmake创建共享库?
- c++11返回值优化或移动?
- Windows和Linux上的c++编译:ifdef开关
- IEEE 754浮点数不能精确表示的第一个整数是哪一个?
- c++中size_t和int的区别是什么?
- 在C和c++中静态变量存储在哪里?
- 为什么标准迭代器范围是[begin, end]而不是[begin, end]?
- c++双地址操作符?(& &)
- 我看到VARCHAR(255)如此频繁地使用(而不是其他长度),有什么好的原因吗?
- 函数标题中的箭头操作符(->)
- 如何在c++中初始化一个向量