gpt4 book ai didi

c++ - 我能否检测哪些类型在用作基类时可能与其派生类重叠

转载 作者:行者123 更新时间:2023-12-02 00:46:17 25 4
gpt4 key购买 nike

考虑下面的类:

class intchar {
int x;
char y;
};

在 x86 上的所有主要编译器上它的大小都是 8。

现在考虑派生类:

struct derived : intchar {
char z;
};

在 Linux 的 gcc 和 clang1 上,此类具有大小 8,尽管该类非空且派生自大小 8 的基类。因此,衍生::z 的存储与base 对象重叠:z 存储在base 的填充中。

这在其他场景中不会发生。例如。如果我将 intchar 更改为 struct 而不是 class,则 衍生 的大小为 12:没有重叠。

是否有任何我可以检查基类的条件或特征,以排除重叠?在此特定示例中,std::is_aggregate 有效,但我不知道为什么会出现这种情况,或者在另一个示例中是否会失败。

<小时/>

1 奇怪的是,icc 在这里不一致,报告 衍生 的大小为 12,所以我猜它与 clang 或 gcc 不兼容 C++ ABI。

最佳答案

如果可能存在重叠,那么只有一个 char 的测试用例应该会发生这种情况,因此您可以编写如下所示的类型特征:

template<class Base>
struct can_overlap {
private:
struct helper : Base {
char a;
};
public:
static constexpr bool value = sizeof(Base) == sizeof(helper);
};

template<class B>
static constexpr bool can_overlap_v = can_overlap<B>::value;

static_assert(can_overlap_v<intchar>);

我看到的唯一可能的问题是继承类型(私有(private)、公共(public)、 protected )有所不同,但这很容易使用更多辅助结构进行检查,然后您可以选择不同的可能性。

关于c++ - 我能否检测哪些类型在用作基类时可能与其派生类重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59855479/

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