gpt4 book ai didi

c++ - 对于空类型的变体,为什么 std::variant 实现需要超过 1 个字节?

转载 作者:行者123 更新时间:2023-12-04 11:08:26 24 4
gpt4 key购买 nike

这主要是琐碎的问题,因为我怀疑我是否需要节省空间。
godbolt 上玩耍时我注意到 std::variant 的 libstdc++ 和 libc++ 实现需要超过 1 个字节来存储空结构的变体。
libstc++ 使用 2 个字节
libc++ 使用 8 个字节
我认为优化这个是不值得的,但我想知道是否还有其他原因。特别是在 std::variant 的标准措辞中有什么东西吗?这会阻止这种优化。

最佳答案

每个对象至少占用 1 个字节的空间。计数器本身至少需要占用 1 个字节,但您还需要为对象的潜在选择空间。即使您使用 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 的“ potentially-overlapping subojects”或其任何内部成员。因此,用户执行 memcpy 是 100% 可以的。从一个微不足道的空物体到另一个。
如果计数器与其重叠,它将覆盖计数器。因此,它不能与它重叠。

关于c++ - 对于空类型的变体,为什么 std::variant 实现需要超过 1 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69049745/

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