Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同类中相同结构定义的二进制兼容性_C++ - Fatal编程技术网

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);