POD 对包含标准库容器的结构的影响
POD implications for a struct which holds an standard library container
我最近遇到了这个问题。我的目标是了解C++编译器如何查看包含标准库容器(如 std::vector)的结构定义。
Ben Voigt 对链接问题的回答引用了 C++0x 标准的以下内容:
....
普通类是具有普通默认构造函数 (12.1) 并且可简单复制的类。
[ 注意:特别是,一个平凡可复制或平凡的类没有虚函数或虚拟基 类。— 尾注 ]
标准布局类是具有以下特性的类:
- 没有非标准布局类(或此类类型的数组)类型的非静态数据成员或引用,
....
我几乎可以肯定粗体文本暗示以下内容是未定义的行为
struct A
{
std::vector< SomeType > myVec;
int myC;
A( int c ) : myC : (c) {}
};
int main( void )
{
A one( 1 );
A two( 2 );
SomeType k, z;
one.myVec.push_back( k );
two.myVec.push_back( z );
memcpy( &two, &one, sizeof( A ) ); // bad juju
}
来自标准库的任何类型也是如此,包括更简单的类型,如 std::string
。这是由于库设计的性质,因为它大量使用继承和模板编程。
因此,虽然struct A
类似于 POD 类型,但就编译器而言,它包含该标准库类型的事实会自动使其从该类别中失效。
我的假设正确吗?
No.你的基本假设是有缺陷的。"标准布局"与模板无关。例如 std::pair<T1, T2>
具有标准布局当且仅当T1
和T2
都这样做。std::array<T,N>
也是如此
但是,没有一个容器具有标准布局。它们的分配器的全部意义在于具有高级内存管理。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- 结构/类是否以某种方式影响内存填充
- 结构的大小会受到数组元数据的影响吗?
- 局部结构通过使用共同的模板功能来影响不同的翻译单元
- 为C++结构定义显式析构函数如何影响调用约定
- POD 对包含标准库容器的结构的影响
- 将一个结构复制到另一个结构以及改变一个结构对另一个结构的影响
- __attribute__(__packed__))对嵌套结构有什么影响?
- 额外的继承对对象结构或实例化有影响吗?