use*_*635 5 c++ pointers strict-aliasing reinterpret-cast
根据严格的别名规则:
struct B { virtual ~B() {} };
struct D : public B { };
D d;
char *c = reinterpret_cast<char*>(&d);
Run Code Online (Sandbox Code Playgroud)
A char*对任何不同类型的对象都是有效的.但现在的问题是,它是否会指向&d的相同地址?C++标准保证返回相同地址的保证是什么?
c并且&d确实也有相同的值,如果你重新诠释铸c回D*你得到一个有效的指针,你可能会取消引用.此外,你可以将c(指向第一个元素的指针)视为一个不透明的数组char[sizeof(D)]- 这确实是指向char指针的指针的主要目的:允许(de)序列化(例如ofile.write(c, sizeof(D));),尽管你通常只应该这样做原始类型(及其数组),因为化合物类型的二进制布局通常不以便携方式指定.
正如@Oli正确地指出并希望我强化一样,你应该永远不要将复合类型作为一个整体来序列化.结果几乎永远不会被反序列化,因为数据字段之间的多态类和填充的实现没有指定,并且您无法访问.
请注意,reinterpret_cast<char*>(static_cast<B*>(&d))可以char[sizeof(B)]通过类似的推理将其视为不透明数组.