C++ 不同类中相同结构定义的二进制兼容性
在不同的类中定义的相同的简单结构定义,可能是使用相同的编译器和标志编译的不同程序文件,在内存中是否相同?常识说他们应该这样,但常识和语言标准并不总是很匹配 在代码中相同,下面的C++ 不同类中相同结构定义的二进制兼容性,c++,C++,在不同的类中定义的相同的简单结构定义,可能是使用相同的编译器和标志编译的不同程序文件,在内存中是否相同?常识说他们应该这样,但常识和语言标准并不总是很匹配 在代码中相同,下面的assertAB方法是否定义良好,并且它是否总是通过所有断言(假设double value是一个数字) 是的,他们是。每个定义都有并且将有一个众所周知的大小和布局。但是,“memcpy”可能会破坏复制构造(如果结构不是POD)Astruct和Bstruct是布局兼容的,但是您正在修改构造对象: std::memcpy(&a
assertAB
方法是否定义良好,并且它是否总是通过所有断言(假设double value是一个数字)
是的,他们是。每个定义都有并且将有一个众所周知的大小和布局。但是,“memcpy”可能会破坏复制构造(如果结构不是POD)
Astruct
和Bstruct
是布局兼容的,但是您正在修改构造对象:
std::memcpy(&s2, &s1, sizeof s2);
<> > <代码> S2<代码> >代码> bStrut < /C> >这是未定义的行为,如我们从C++标准部分草案<代码> 7.1.61 CV限定符第4段:可以看到的。
[…]在常量对象的生存期(3.8)内修改常量对象的任何尝试都会导致未定义的行为。[…]
实际上,这一问题已包含在第3.9节中,因为第3段似乎暗示它是有效的。它说:
7.1.6.1[dcl.type.cv]第4段已经禁止修改POD结构的常量成员。3.9[基本类型]中无需重复禁止
关于构造,是的,这就是为什么代码有char[]
而不是std::string
。它们是,但这是一条危险的道路,最好使用相同的结构进行更安全的维护。
std::memcpy(&s2, &s1, sizeof s2);