c中的短短整数?

Gri*_*fin 4 c int boolean short char

我试图尽可能地挤出我的记忆.我有一个4.9999995e13整数矩阵,但它们只需要是真或假 - 基本上我只需要为这些整数中的每一个存储一位.

我知道C中没有单一的位类型(也许有人可以解释为什么,对我来说),而且我也知道如果short short int存在它将是1字节,与char相同.但是,C中的所有逻辑运算都返回整数(以及一些其他函数).

所以我的问题是:

  • 有没有办法让short short int存在?
  • 如果我要使用char,那么我是否会因为所有int必须完成的铸造而降低性能?
  • 还有另外一种方法让我失踪吗?

只是在案件中它是相关的,我正在与GCC编译C99.

编辑我刚刚在这个维基百科页面上看到有一种_Bool类型,这实际上是标准的吗?

JSB*_*ոգչ 6

__Bool类型在最新版本的C中是标准的,但这仍然不是您想要的,因为__Bool仍然至少占用一个字节(根据char定义,a).

不,如果你想要那么多布尔位,你需要将它们打包成位域位数组.C中的位域没有标准数据类型,因此您还必须编写自己的宏或函数来获取特定偏移量的位.我也希望你能在拥有大量内存的64位机器上运行它,否则你将会耗尽内存并快速运行.

  • @Griffin,数据大小与您所拥有的一样大,移入和移出内存的成本淹没了执行成本.你没有5e13字节的内存,你的机器上只有~3e10,所以你可以做的任何事情都可以让数据集适合你的内存. (3认同)

use*_*653 5

你想要的是一个位图(或维基百科称之为位数组).

并且没有这样的东西short short int,这只是charC中最小的整数存储类.

使用这种方法时可能会有一些性能开销,但不是因为对int的隐式转换,而是因为操作位图比直接操作数组成员更棘手.

一个小例子可能有助于说明:

使用普通整数矩阵:

int mat[8*8]; // assuming row major order
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);
}
Run Code Online (Sandbox Code Playgroud)


n. *_* m. 5

您有大约 50 TB 的数据。您想一次将它们全部放入 RAM 中吗?使用多于一位的 RAM 来保存一位信息将是完全疯狂的,即使这样,您的计算机也必须与这个星球上最大的超级计算机的大小差不多。忘记位打包的性能。你将不得不担心完全不同的事情。