【问题标题】:C++: Is bool a 1-bit variable?C++:bool 是 1 位变量吗?
【发布时间】:2017-10-21 10:20:52
【问题描述】:

我想知道 C++ 中的布尔值是否实际上是 1 位变量。 我正在为我的内核开发 PMM,使用(可能是多维的)布尔数组会很安静。但是如果 C++ 中的 bool 长度为 8 位,我不想浪费空间......

编辑:bool[8] 是 1 字节长吗?还是 8 字节?我可以在使用 gcc 时声明类似bool bByte[8] __attribute__((packed)); 的东西吗? 正如我所说:我正在编写一个内核。所以我不能包含标准库。

【问题讨论】:

  • A bool 可以是 1 个字节或更多,具体取决于实现。见fundamental types
  • 它是1字节(8位),使用位域或手动编写代码来访问内存缓冲区中的位。
  • 至于你的recent question,你似乎对你想要实现的目标很不满意。我会让你有机会在 g-makulik t-online.de 私下联系我,通过电子邮件讨论这个问题,并获得一些严肃而有根据的建议。否则,从this list 阅读一些教科书应该同样为您服务。
  • @Pavel:请提供对标准的参考,其中 1)一个字节保证为 8 位,2)bool 保证为 1 个字节。
  • @Olaf 我写的是代码,而不是标准,我更关心我在现实中看到的东西。那些在sizeof(bool) != 1CHAR_BIT != 8 的晦涩环境中工作的人不会问这些类型的问题。问题主要是布尔变量是否占用 1 位。

标签: c++ memory-management kernel


【解决方案1】:

不,没有像 1 位变量这样的东西。

c++ 中可以寻址的最小单位是unsigned char

bool[8] 是 1 字节长吗?

没有。

还是 8 字节?

不一定。取决于目标机器为 unsigned char 占用的位数。


但是如果 C++ 中的 bool 长度为 8 位,我不想浪费空间...

使用std::bitsetboost::dynamic_bitset(如果需要动态调整大小)处理位时,可以避免浪费空间。


正如@zett42 in their comment 所指出的,您还可以使用位域结构来寻址单个位(但出于缓存对齐的原因,这可能会使用更多空间):

struct S {
    // will usually occupy 4 bytes:
    unsigned b1 : 1, 
             b2 : 1,
             b3 : 1;
};

【讨论】:

  • 不,没有像 1 位变量这样的东西。 ...除了bit fields
  • @zett42 好吧,这些是不同的野兽。但不知何故是的。
  • @MathiLpHD 你可以使用位域。
  • 您没有提及最初定义的容器以提供 OP 所需的功能。
  • @Hover THX 用于备份。到目前为止,它只是一个单一的dv。价值肯定会随着时间的推移而发展。如今,基于代表的投票似乎无处不在。顺便提一下 D.J.特朗普等......
【解决方案2】:

bool 使用至少一个(甚至更多)字节的存储空间,所以是的,至少 8 位。

然而,vector<bool> 通常只将bool 存储在一位中,并以代理迭代器的形式存在一些巧妙之处,例如(主要)模仿对实际bool 对象的访问,尽管这不是什么他们存储。原来的 C++ 标准要求这个。最近的一些放宽了要求,允许 vector<bool> 实际上是您通常期望的(即,只是一堆 bool 对象)。然而,尽管要求放宽了,但仍有相当数量的实现继续将它们以打包形式存储在 vector<bool> 中。

但请注意,其他容器类型并非如此——例如,list<bool>deque<bool> 不能使用位压缩表示。

还请注意,由于需要代理迭代器(等等),使用位压缩表示进行存储的vector<bool> 无法满足对普通容器施加的要求,因此您需要注意什么你对他们的期望。

【讨论】:

  • @πάνταῥεῖ:为什么,确切地说,你认为指出错误答案有用吗?
  • 我实际上向您指出了我的评论。出于同样的原因,您的答案很糟糕。
  • @πάνταῥεῖ:您的评论几乎同样错误。虽然有些人确实认为“vector` 不好,但这种观点充其量只是过于简单化了。其中大多数是基于vector(其他类型)是一个容器这一事实,而vector<bool> 不是。这 可能 违反预期,但在这种情况下,OP 似乎完全渴望它提供的东西。您对 vector<bool> 的不合理偏见并没有做出敢于提及它的每个答案“坏”。
  • @MathiLpHD:编写内核代码并不意味着您根本不能使用std:: 函数。标准容器(std::array 除外)可以使用动态分配,因此您需要提供在内核模式下工作的分配器,但不完全是火箭科学。
【解决方案3】:

可寻址内存的最小单位是charbool[N]std::array<bool, N> 将使用与 char[N]std::array<char, N> 一样多的空间。

标准允许(尽管不是必需的)std::vector<bool> 的实现可以专门将位打包在一起。

【讨论】:

  • 不正确:"bool - 类型,能够保存以下两个值之一:true 或 false。sizeof(bool) 的值是实现定义的,可能与 1 不同。" 来源:en.cppreference.com/w/cpp/language/types
  • @RichardCritten 完全正确,但不是 OP 期望的那样。如果不同,则只能大于 1。
  • std::vector<bool> 被认为是坏的,因为各种(和有效的)原因。
  • @πάνταῥεῖ 这是真的。不幸的是,如果N 在编译时未知,则无法使用std::bitset<N>(与std::vector<bool>bool[N] 不同),因此这取决于用例。
  • @ephemient 好吧,还有boost::dynamic_bitset
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
相关资源
最近更新 更多