首页 文章

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

提问于
浏览
3

我最近遇到了this问题 . 我的目标是了解C编译器如何查看包含标准库容器(如std :: vector)的结构定义 .

Ben Voigt's对链接问题的回答引用了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类型,但就编译器而言,它包含该标准库类型的事实会自动使其无效 .

我的假设是否正确?

1 回答

  • 3

    不,你的基本假设是有缺陷的 . "Standard layout"与模板无关 . 例如 . 当且仅当 T1T2 都有时, std::pair<T1, T2> 具有标准布局 . 同样适用于 std::array<T,N>

    但是,没有一个容器具有标准布局 . 他们的分配器的重点是拥有先进的内存管理 .

相关问题