【发布时间】:2015-05-28 16:55:55
【问题描述】:
最近学习了 c++ 中的联合,我想出了这个来处理由单个 uint64_t 等表示的多个标志
union myflags_t
{
uint64_t var;
std::bitset<64> bits;
myflags_t() { }
};
我之前使用的另一种方法是bit operations,特别是设置位和将第n位更改为x。
相反,我可以使用
myflags_t flags;
flags.var = 0;
flags.bits[nth bit] = ...
我的问题是联合或位操作哪个更快?
另外,如果使用联合更快,为什么我以前没有遇到过这个?
编辑: 删除 memset(被误解,不需要它) 我使用 union 的原因是因为稍后在代码中我需要将变量作为 uint64_t 传递 编辑2: 阅读 cmets ,我确信我使用 union 错误。代码创建了未定义的行为,因为联合并不意味着类型双关语。即将结束问题。
【问题讨论】:
-
"如果使用联合更快,为什么我以前没有遇到过?" - 因为它依赖于未定义的行为。
-
@LightnessRacesinOrbit 我应该使用什么来代替 memset?
-
如果您要使用标准,请使用标准。在这种情况下, bits.reset() 会将存储在位中的所有内容重置为 0。在此示例中添加并集只会使事情变得不那么清晰。不是你的问题的答案,但我没有尝试过。
-
@DisplayName101:您滥用
union来执行无效的类型双关语。这不是union的用途。这是一个常见的误解。 -
@DisplayName101 正如其他人所说,
union并非旨在在类型之间翻转位。当您只需要其中一种类型时,它旨在节省空间。如果您需要在某些时候使用uint32_t,您可能应该从一开始就使用uint32_t并坚持下去。您也可以只使用bitset并稍后将其转换为uint32_t。