【发布时间】:2018-11-18 19:26:17
【问题描述】:
我有一个应用程序需要尽可能多地节省内存。我需要存储大量可以取三个可能值的数据。所以,我一直在尝试使用 2 位大小的类型。
一种可能性是使用位域。我可以的
struct myType {
uint8_t twoBits : 2;
}
这是来自this thread的建议。
但是,在此之前我使用过int 变量的任何地方,我都需要通过附加.twoBits 来更改它们的用法。我检查了是否可以在struct 之外创建一个位字段,例如
uint8_t twoBits : 2;
但this thread 说这是不可能的。但是,该线程是特定于 C 的,所以我不确定它是否适用于 C++。
有没有一种干净的方法可以定义 2 位类型,这样只需将 int 替换为我的类型,我就可以正确运行程序?还是使用位域是唯一可能的方法?
【问题讨论】:
-
存在定位宏。假设您使用的是 gcc。我相信其他人有自己的方法。 gcc.gnu.org/onlinedocs/gcc-3.0.4/gcc_21.html 特别是 INT_TYPE_SIZE 存在。从来没有尝试过自己使用它,所以ymmv
-
你有两个位,但结构仍然是一个字节。
myType的数组将是最小可能大小的 4 倍。您可能会发现自己不得不打包和拆包。 -
@user4581301 谢谢。有没有一种干净的方法来定义 myType 以便在不更改任何外部代码的情况下完成打包和解包?
-
是的。您将打包的位数组包装成一个看起来像整数数组的结构。您可以实现
operator[],它为您找到正确的字节并返回对代理类实例的引用,该代理类隐式转换为int并具有知道如何转换int的operator=进入位数组中的正确位置。不幸的是,我没有时间写一个并证明它现在可以正常工作。听起来会很有趣。
标签: c++ types int bit-fields