POD 对包含标准库容器的结构的影响

2024-03-02

我碰到this https://stackoverflow.com/questions/5430801/c-guarantee-and-name-for-pod-like-data-memcpy-capable最近提问。我的目标是了解 C++ 编译器如何查看包含标准库容器(例如 std::vector)的结构定义。

本·沃伊特的 https://stackoverflow.com/a/5453372/763053链接问题的答案引用了 C++0x 标准中的以下内容:

....

A 琐碎的课是一个具有简单默认构造函数 (12.1) 且可简单复制的类。

[ Note:特别是,普通可复制或普通类没有虚函数或虚基 类。 —end note ]

A 标准布局类是一个类:

  • 没有非标准布局类(或此类类型的数组)类型的非静态数据成员或引用,

....

我几乎可以肯定,粗体文本意味着以下是未定义的行为

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
}

同样的情况也适用于anytype 来自标准库,包括更简单的类型,例如std::string。这是由于库设计的本质造成的,因为它大量使用了继承和模板编程。

所以,虽然struct A类似于 POD 类型,事实上它contains就编译器而言,该标准库类型会自动使其从该类别中无效。

我的假设正确吗?


不,你的基本假设是有缺陷的。 “标准布局”与模板无关。例如。std::pair<T1, T2>具有标准布局当且仅当两者T1 and T2做。同样适用于std::array<T,N>

然而,没有一个集装箱有标准布局。他们的分配器的全部目的是拥有先进的内存管理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POD 对包含标准库容器的结构的影响 的相关文章

随机推荐