我知道在C中没有单个比特类型(也许有人可以向我解释为什么),我也知道如果存在一个“short short int”,它将是1字节,与char相同。然而,C中的所有逻辑操作都返回整数(以及其他一些函数)。
所以我的问题是:
- 有没有办法使“short short int”存在?
- 如果我使用“char”代替,“int”强制转换会导致性能下降吗?
- 是否还有其他我不知道的方法?
编辑我刚刚在这个维基百科页面上看到有一个_Bool
类型,这实际上是标准吗?
编辑我刚刚在这个维基百科页面上看到有一个_Bool
类型,这实际上是标准吗?
您有大约50TB的数据。您想一次性将它们全部放入RAM中吗?为了保留一位信息,使用超过一个比特的RAM是完全疯狂的,即使这样,您的计算机也必须达到地球上最大的超级计算机的大小。忘记位打包的性能。您需要担心完全不同的事情。
你需要的是一个位图(或者维基百科称之为位数组)。
在C语言中,不存在short short int
这种类型,这只是一个char
类型而已,它是C语言中最小的整数存储类。
使用这种方法可能会有一些性能开销,但不是因为隐式转换为int类型,而是由于操作位图比直接操作数组成员更加棘手。
下面是一个简单的示例:
使用普通的整型矩阵:
int mat[8*8]; // 假设按行主序排列 int is_element_set(int x, int y) { return mat[y*8 + x]; }
使用位图:
unsigned char mat[8]; // assuming CHAR_BIT == 8
int is_element_set(int x, int y) {
return mat[y] & (1 << x);
}
5e13/8
个字符或5e13/32
个整数中。无论哪种方式,都需要大约5TB的空间 - 因此我肯定会考虑空间效率 - 将数据快速地输入和输出主内存是不可能的。 - AShellyunsigned char mat[5000000000000000/CHAR_BIT]
中,但如果您的数据是稀疏的,最好考虑使用稀疏数据结构。 - user786653如果你要表示比特字段,那么你需要大约5.6 TB的存储空间。但是,处理你的问题可能会有更好的方法。
typedef struct node_t_
{
char bit0 : 1;
char bit1 : 1;
char bit2 : 1;
char bit3 : 1;
char bit4 : 1;
char bit5 : 1;
char bit6 : 1;
char bit7 : 1;
} node_t;
然后,您可以编写一些快速函数(可能是宏),以获取和设置此矩阵中的元素。虽然我从未实现过类似的东西。
C99 stdbool.h
允许使用 bool
。但是,您的问题在于 4.9999995e13/8 大约会得到 6.2500e+12($10^9$ 是 Gbyte,$10^12$ 是 Tbyte),因此您需要超过 6 Tbytes 的实际 + 虚拟内存(要有运气)。这表明您正在做其他错误的事情。您需要将问题“缩放”为您可以使用更少内存处理的子问题。
正如其他人建议的那样,你应该使用位域。
此外,如果你只是使用真/假值,并且其中一个值比另一个值少得多,考虑使用隐式编码。你可以使用映射数据结构轻松实现这一点。由于你正在处理图形,如果你的图形非常稀疏,这将节省大量内存。如果你将其与上面的位打包技术相结合,甚至可能将其全部放入RAM中。不过,你必须对索引进行相当聪明的处理。
另一件事情是,如果你不在意处理过程中的性能损失(即如果你更担心存储而不是处理),可以将结构通过块压缩算法运行。有一个针对bzip2的C库,可以在这方面节省90%或更多的空间。缺点是这需要(非常!)长时间。你可能会从像动态马尔可夫压缩(DMC)这样的位压缩器中获得可比较的性能,而且速度要快得多。
int
类型吗? - aardvarkk