gpt4 book ai didi

c++ - Clang 中的嵌套 C 数组结构对齐

转载 作者:行者123 更新时间:2023-12-01 14:20:18 25 4
gpt4 key购买 nike

我在使用针对 x64 的 Clang 编译的 C++17 中遇到了一个小内存问题。由于我使用低级内存拷贝到专用硬件,因此我确实依赖于按预期对齐的内存。我最近从 Visual Studio 迁移到 Clang 并遇到了以下问题:

请看下面的代码:

struct ContainerRoot{};
template<size_t t_size, class t_type>
struct Container : public ContainerRoot
{
t_type contents[t_size];
};

static_assert(sizeof(Container<1, double>) == 8); //This works as expected
static_assert(sizeof(Container<4, double>) == 32); //This works as expected
static_assert(sizeof(Container<16, double>) == 128); //This works as expected
static_assert(sizeof(Container<4, Container<4, double>>) == 128); //This fails.

在上面的示例中,sizeof(Container< Container>) 实际上是 136(额外的 8 个字节)。我的问题是为什么要添加额外的 8 个字节,我可以避免吗?我很想使用 Clang 编译器,但如果没有解决方法,可能不值得重写围绕将此数据发送到专用硬件的所有代码。

到目前为止,我已经使用 std::is_polymorphic< Container <4, Container<4, double>>>() 进行了检查,只是为了确认没有将一些虚拟查找表添加到类中。

最佳答案

引用 en.cppreference.com :

The size of any object or member subobject [...] is required to be at least 1 even if the type is an empty class type (that is, a class or struct that has no non-static data members), in order to be able to guarantee that the addresses of distinct objects of the same type are always distinct.

此约束不适用于空碱基(空碱基优化)。

但是,en.cppreference.com 还指出:

Empty base optimization is prohibited if one of the empty base classes is also the type or the base of the type of the first non-static data member, since the two base subobjects of the same type are required to have different addresses within the object representation of the most derived type.

不幸的是,在处理 Container<4, Container<4, double>> 时就是这种情况作为第一个成员,类型为 Container<4, double> ,以及 Container<4, Container<4, double>>都继承自 ContainerRoot .

因此,我假设 MSVC 在这种情况下实际上是错误的,并且过早地应用了它不能做的优化。

关于c++ - Clang 中的嵌套 C 数组结构对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61582601/

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