不同类中相同结构定义的二进制兼容性
Binary compatibility of identical struct definitions inside different classes
相同的简单结构定义,在不同的类中定义,可能是使用相同的编译器和标志编译的不同程序文件,在内存中是否相同?常识说他们应该如此,但常识和语言标准并不总是完全匹配......
在代码中相同,下面的方法是否定义assertAB
并且它是否总是传递所有断言(假设双精度值是一个数字)?
class Aclass {
public:
struct Astruct {
int i1;
char s1[10];
double d1;
}
}
class Bclass {
private:
struct Bstruct {
int i2;
const char s2[10];
double d2;
};
public:
void assertAB(Aclass::Astruct s1) {
Bstruct s2;
std::memcpy(&s2, &s1, sizeof s2);
assert(s1.i1 == s2.i2);
assert(std::strncmp(s1.s1, s2.s2, sizeof (s2.s2)) == 0);
assert(s1.d1 == s2.d2);
}
}
Astruct
和Bstruct
布局兼容,但您在此处修改const
对象:
std::memcpy(&s2, &s1, sizeof s2);
由于Bstruct
中的s2
是常量,这是我们从草案C++标准部分7.1.6.1
中看到的未定义的行为 简历限定符第4 段:
[...]在 const 对象的生存期 (3.8) 期间修改该对象的任何尝试都会导致未定义的行为。[...]
而这个确切的问题实际上在缺陷报告290中涵盖了,因为第3.9
段第3段似乎暗示它是有效的。它说:
7.1.6.1 [dcl.type.cv] 第4款已经禁止修改POD结构的常量成员。禁止不需要在3.9[基本类型]中重复。
是的,他们是。每个定义都有并且将具有众所周知的大小和布局。但是,"memcpy"可能会破坏复制构造(如果结构不是 POD)
相关文章:
- STL 用户定义的二进制操作
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 如何在Qt中使用QDataStream将自定义结构保存/加载到二进制文件中?
- 无法使用迭代器查找类对象。(二进制 '==': 'userInfo' 不定义此运算符)
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- 如何使用自定义对象的序列化在 c++ 中编写自定义二进制文件处理程序
- 自定义二进制文件在 C++ 中触发故障位
- C2676 - 二进制'++'未定义此运算符
- 自定义一元/二进制Expr() eigen3 的参数
- Cmake:如何构建自定义编译器二进制文件,然后将其用于某些目标?
- 在定义C2679和C2678错误代码的地方未找到二进制操作员
- 在自定义双链接列表中的自定义迭代器的取消运算符,找不到二进制操作员
- 自己的C++网络协议:如何定义唯一的二进制报文值
- Python 3.3 中的自定义二进制 json 与 UBJsonReader Libgdx 兼容
- 如何在VC++静态库中加载自定义二进制资源作为dll的一部分
- 在C++11中定义二进制文件的结构
- visual C++自定义二进制资源文件
- 在类中定义二进制运算符的风格指南/约定(c++)
- 如何布局自定义二进制文件格式
- 如何创建、读取和写入自定义二进制文件格式