【发布时间】:2023-04-05 02:33:01
【问题描述】:
我需要压缩结构以节省内存,我得到了这样的数据结构:
enum class Foo {
F1,
F2,
F3,
FEnd,
};
struct Bar {
bool b: 1;
Foo foo : 2; // Foo has 3 elements, 2 bits can represent them
};
而且Foo 的元素仍有可能增加,所以我不想硬编码Foo foo:2 并在每次Foo 添加元素时更改它。
目前我有一个解决方案:constexpr static int i = 32 - __builtin_clz(static_cast<int>(Foo::FEnd));,但这太丑陋且不便携。
那么有什么建议吗?
【问题讨论】:
-
RAM 很便宜。节省一些比特很少值得麻烦。
-
我不确定到底是什么问题。您可以在
constexpr函数中天真地实现clz(x),请参阅例如en.wikipedia.org/wiki/Find_first_set#CLZ 的算法。这还不够吗? -
C++ 中的枚举不是不可变的吗?您为什么担心有人向
Foo添加更多枚举字段,这实际上会改变每个枚举值的大小吗? -
@smac89 这点更有可能是当程序员在枚举定义中添加元素以避免错误时,位域大小应该自动正确。
-
@uneven_mark 我认为你是对的,出于便携的原因,我应该自己写
constexpr int clz(x)
标签: c++ enums bit-fields