c++ - 为什么这个结构需要 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 个字节。
解决方案
区分存储类型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>));
推荐阅读
- python - 如何更改我的 requests.get() 函数的发送方式?
- php - 我的网站总是内存不足(致命错误)
- vue.js - 在 bootstrap-vue 中折叠时如何隐藏导航栏
- python - 在 Python 中使用过滤器从文本文件中过滤行
- swift - 核心数据:ID 已设置,但保存时显示为 nil
- laravel - 在控制器内部的 Laravel 中使用 Summer Note 文本编辑器时如何将 base64 图像转换为 Url 图像?
- spring-boot - 未经授权的错误:访问此资源需要完全身份验证
- blazor - 在通过 Http.GetStringAsync 使用 IP 访问的“本地模式”下将 Blazor WebAssembly 与 Azure 函数一起使用时,我收到“无法获取错误”
- python - 在熊猫中将月份从数字重命名为名称
- flutter - RedirectException:检测到重定向循环