首页 > 解决方案 > 为什么这个结构需要 24 个字节

问题描述

    template<typename T>
    struct OctreeNode {
    std::variant<std::unique_ptr<OctreeNode<T>[]>, std::unique_ptr<T>> data;
    bool isLeaf;
    }
    sizeof(OctreeNode<int>)

我正在使用 x64 clang 10。我认为变体需要 8 个字节,对齐布尔值需要 8 个字节。

标签: c++memorytypes

解决方案


区分存储类型std::variant包含您的计算遗漏的附加整数值。

#include <variant>
#include <memory>

template<typename T>
struct OctreeNode {
    std::variant<std::unique_ptr<OctreeNode<T>[]>, std::unique_ptr<T>> data;
    bool isLeaf;
};

template<typename T>
struct OctreeNodeAltVariant {
unsigned char index;
union {
    std::unique_ptr<OctreeNode<T>[]> a;
    std::unique_ptr<T> b;
};
};

template<typename T>
struct OctreeNodeAlt {
    OctreeNodeAltVariant<T> data;
    bool isLeaf;
};

static_assert(sizeof(OctreeNode<int>) == sizeof(OctreeNodeAlt<int>));

https://godbolt.org/z/UU_LP8


推荐阅读