我最近遇到了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 回答
不,你的基本假设是有缺陷的 . "Standard layout"与模板无关 . 例如 . 当且仅当
T1
和T2
都有时,std::pair<T1, T2>
具有标准布局 . 同样适用于std::array<T,N>
但是,没有一个容器具有标准布局 . 他们的分配器的重点是拥有先进的内存管理 .