2

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

代码相同,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);
    }        

}
4

2 回答 2

1

对,他们是。每个定义都有并且将有一个众所周知的大小和布局。但是,“memcpy”可能会破坏复制构造(如果结构不是 POD)

于 2013-11-12T19:51:11.180 回答
1

Astruct并且布局兼容,但您在此处修改Bstruct对象:const

std::memcpy(&s2, &s1, sizeof s2);

因为s2inBstructconst并且这是未定义的行为,正如我们从草稿 C++ 标准部分7.1.6.1 The cv-qualifiers4段中看到的那样:

[...]在其生命周期(3.8)期间修改 const 对象的任何尝试都会导致未定义的行为。[...]

并且这个确切的问题实际上已包含在缺陷报告 290中,因为3.9 第 3节似乎暗示它是有效的。它说:

7.1.6.1 [dcl.type.cv] 第 4 段已经禁止修改 POD 结构的 const 成员。禁止在 3.9 [basic.types] 中不需要重复。

于 2013-11-12T20:50:28.120 回答