不同类中相同结构定义的二进制兼容性

Binary compatibility of identical struct definitions inside different classes

本文关键字:定义 二进制 兼容性 结构 同类      更新时间:2023-10-16

相同的简单结构定义,在不同的类中定义,可能是使用相同的编译器和标志编译的不同程序文件,在内存中是否相同?常识说他们应该如此,但常识和语言标准并不总是完全匹配......

在代码中相同,下面的方法是否定义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);
    }        
}

AstructBstruct布局兼容,但您在此处修改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)