gpt4 book ai didi

c++ - union 中的位字段 - 这有多便携?

转载 作者:行者123 更新时间:2023-11-27 23:09:02 26 4
gpt4 key购买 nike

我有一个带有一堆标志的位字段,我需要一种快速而肮脏的方法来将所有内容设置为零,所以与其盲目地将结构转换为整数,我决定将具有实际整数的 union 中的位字段。

union Flags {
uint _all;
struct {
uint status : 2;
uint expanded : 1;
uint draw : 1;
uint drawChildren : 1;
uint hidden : 1;
uint disabled : 1;
uint used : 1;
uint deletable : 1;
uint incomplete : 1;
uint isStatic : 1;
uint isConst : 1;
uint isVolatile : 1;
uint isInline : 1;
uint isMutable : 1;
uint isExtern : 1;
uint isRegister : 1;
uint threadLocal : 1;
uint packed : 1;
uint dirty : 1;
uint native : 1;
uint dynamic : 1; // 22
uint _padding : 10;
} flags;
};

我的问题是它的便携性如何?我是否可以期望它使用 GCC 作为编译器跨不同平台(主要对 windows、linux、macos、android、ios 感兴趣)可移植?

或者可能转换为一个整数并以这种方式设置它并摆脱并集是可行的方法吗?我一直在读到位字段不可移植,但例如 Qt 似乎经常使用它们,而且它似乎在我列出的平台上一致地工作。

最后但并非最不重要的一点,即使没有 union ,我能否期望位域是可移植的?

编辑:无法添加 C 作为标签,但我也需要它在 C 中工作,所以我也不能使用 std::bitset我有一个成员需要不止一位。

编辑 2:另请注意,没有任何成员越过其对齐边界,我认为这应该会导致编译器不添加额外的填充。

编辑 3:也许我可以使用 GCC 的 __attribute__(packed) 来防止编译器破坏结构?

最佳答案

位域根本不可移植。它们之间的填充取决于实现。也许你想要一个 std::bitset

关于c++ - union 中的位字段 - 这有多便携?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21350852/

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