c++ - 为什么 std::variant 实现对空类型的变体占用超过 1 个字节?
问题描述
这主要是琐事问题,因为我怀疑我是否需要节省空间。
在玩Godbolt 时,我注意到 libstdc++ 和 libc++ 实现都std::variant
需要超过 1 个字节来存储空结构的变体。
libstc++ 使用 2 个字节
libc++ 使用 8 个字节
我认为优化这个是不值得的,但我想知道是否还有其他原因。特别是标准措辞中是否std::variant
存在阻止这种优化的内容。
解决方案
每个对象至少占用 1 个字节的空间。计数器本身至少需要占用 1 个字节,但您还需要空间来放置对象的潜在选择。即使您使用 a union
,它仍然需要是一个字节。并且不能和计数器是同一个字节。
现在,您可能会认为这可以解决问题,如果所有元素都为空no_unique_address
,则允许成员union
与计数器重叠。union
但是考虑一下这段代码:
empty_type e{};
variant<empty_type> ve{in_place_index<0>}; //variant now stores the empty type.
auto *pve = ve.get_if<0>(); //Pointer to an `empty_type`.
memcpy(pve, &e, sizeof(empty_type)); //Copying from one trivial object to another.
该标准没有说变体的成员是其内部成员或其任何内部成员的“潜在重叠的主题” 。variant
因此,用户memcpy
从一个琐碎的空对象到另一个是 100% OK 的。
如果它与它重叠,它将覆盖计数器。因此,它不能与它重叠。
推荐阅读
- css - Angular Material列宽适合内容?
- javascript - 当我想获取 formData 时 POST 转换为 GET?
- image - 在不丢失透明度的情况下调整 TWICImage 的大小
- spring-roo - ROO 在错误的文件夹中寻找捆绑包
- r - 使用 terminal_panel node_bivplot 或 node_barplot 显示 glmtree 的问题
- php - PHP:执行 bash 脚本启动 Chromium 浏览器
- php - 用它们的键查找重复值
- java - 如何在android的一个recyclerview中实现多个视图
- python - django 频道私聊
- java - 无法使用 Java Jira Rest Client 更新 jira 中问题的单选字段