【问题标题】:Why there isn't a single bit data type in C/C++? [duplicate]为什么 C/C++ 中没有单比特数据类型? [复制]
【发布时间】:2013-10-20 10:35:24
【问题描述】:

bool 是 8 位的,只有真假,为什么不做单位。

而且我知道有bitset,但不是那么方便,我只是想知道为什么?

【问题讨论】:

  • 可能是因为处理器不支持它。另外,看看位域。
  • 谁说“bool 是 8 位”?
  • 每次你想要一个布尔值时都使用一个位是低效的,因为需要在 CPU 中确定一个字节或一个字中正确的对应位并检查它。唯一有意义的情况是您管理一组布尔值,这就是位字段或位集的用途。
  • 本质上,因为在大多数机器上,内存是字节寻址的。
  • 因为 C++ 中的对象想要有地址,而一个位没有地址。 (只要 CHAR_BIT != 1)

标签: c++ c boolean bitset


【解决方案1】:

主流CPU硬件层面的基本数据结构是一个字节。对这些 CPU 中的位进行操作需要额外的处理,即一些 CPU 时间。 bitset 也是如此。

【讨论】:

  • 实际上基本的数据结构通常是一个字,通常有足够的 4(32 位)、8(64 位)甚至更多(例如 SSE)字节的宽度。每字节操作通常在那些更大的字操作中被伪造,有时甚至比本机字操作慢,类似于您所说的位。不要将内存的基本数据结构(例如字节可寻址)与 CPU 的数据结构相混淆。
【解决方案2】:

不完全是为什么没有原生类型的答案。但是您可以在这样的结构中获得 1 位类型:

struct A {
  int a : 1; // 1 bit wide
  int b : 1;
  int c : 2; // 2 bits
  int d : 4; // 4 bits
};

因此,如果没有填充,sizeof(A) == 1 可能是(这可能会将它带到sizeof(void*) 的倍数,即对于 32 位系统可能是 4)。

请注意,由于其他人所述的原因,您无法获得指向任何这些字段的指针。这也可能是不存在原生类型的原因。

【讨论】:

    猜你喜欢
    • 2010-12-27
    • 2013-04-26
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多