【发布时间】:2015-06-28 06:40:23
【问题描述】:
这是关于 ANSI-C (C90) 的。这是我所知道的:
- 我可以直接告诉编译器我想要一个特定变量多少位。
- 如果我想要 1 位,它的值可以为零或一。
- 或 2 位表示值 0、1、2、3 等...;
我对语法很熟悉。
我有关于位域的问题:
- 我想定义一个 SET 结构。
- 最多可以有 1024 个元素(可以少一些,但最多可以有 1024 个元素)。
- 集合的域是从 1 到 1024。所以一个元素可以有任何值 1-1024。
我正在尝试为 SET 创建一个结构,它必须对内存部分尽可能高效。
我试过了:
typedef struct set
{
unsigned int var: 1;
} SET;
//now define an array of SETS
SET array_of_sets[MAX_SIZE] //didn't define MAX_SIZE, but no more than 1024 elements in each set.
我知道这没有效率;也许它甚至不适合我想要的。这就是我寻求帮助的原因。
【问题讨论】:
-
每个算法位可能会使用 32 位存储空间,这与您所追求的空间效率相反。至少,每个算法位将使用 8 位存储(除非您有一个古怪的机器,在这种情况下它可能会使用而不是更少)。您需要考虑位掩码和适当大小的某些子物种或其他(
unsigned long long或uint64_t等)的无符号整数数组。位域有时也有其用途。这绝对不是其中之一。 -
如果您只关心内存效率,我认为您最好编写自己的函数来获取/设置数组的 1 位元素,例如一次打包 8 个元素在一个 char 数组元素中。可能使用 64 位 ibt 在缓存方面会更好
-
@kasperd 是的,你明白我的意思。编译器为八个数组元素分配了多少字节?如果不止一个,那么我的建议成立
-
@kasperd 因为 1. 位不能在 C 中寻址,最小的可寻址存储单元是一个字节,以及 2. 数组条目需要单独对齐。
-
@kasperd:不,位域不会神奇地使位在硬件级别上可寻址。位域通过让编译器生成按位掩码操作来模拟位寻址访问来解决位不可寻址的事实。没有办法实现位域数组。像这样尝试使用位域来节省空间是没有意义的。没有任何。它实际上会占用内存中的存储空间,而代码访问这些位会占用更多的内存空间。不是一个好的权衡。
标签: c bit-fields