gpt4 book ai didi

c++ - 对相同基类的引用必须在内存中具有单独的偏移量

转载 作者:可可西里 更新时间:2023-11-01 17:51:52 24 4
gpt4 key购买 nike

我发现这个程序的编译器之间存在一些不一致,

struct A {
};

struct B : public A {
float m;
};

struct C : public A {
B b;
float n;
};

struct D : public A {
float n;
B b;
};

static_assert(sizeof(A) == 1, "");
static_assert(sizeof(B) == 4, "");
static_assert(sizeof(C) == 8, ""); // most compilers say this is 12
static_assert(sizeof(D) == 8, "");

大多数编译器断言 sizeof(C) == 8 表示 sizeof(C) 实际上是 12。我发现唯一一个不是这样并说它是 8 的编译器是 Microsoft Visual Studio 2010。

比我聪明的人告诉我的原因是,B 中有两个单独的 A 引用需要保留彼此不同的偏移量。首先,从 C 派生的 A 的偏移量为 0,成员 b 中的第二个 A 不能与第一个 A 在 0 处的偏移量相同,因此插入了 4 个字节的填充。

由于大多数编译器都实现了这种行为,我想知道在什么情况下您需要确保两个 A 具有不同的引用?想知道为什么会这样吗?

有人说这可能是标准要求的条件,我们很好奇这是什么原因?

谢谢

最佳答案

标准明确要求同一类型的每个对象的地址是不同的。相关条款是 5.10 [expr.eq] 第 1 段:

Two pointers of the same type compare equal if and only if they are both null, both point to the same function, or both represent the same address (3.9.2).

这是区分这两个对象所必需的。对象既有值又有身份。对于基类子对象,具有与包含类相同的地址是合理的。对于一个类的成员,可以通过类型来区分两个对象的身份,即它们具有相同的地址是可以的。对于同一类型的两个对象,您仍然需要一些东西来区分对象的身份。

关于c++ - 对相同基类的引用必须在内存中具有单独的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com