在Array C ++中每个bool 1位

时间:2010-10-29 05:13:53

标签: c++ arrays sizeof boolean

bool fp[81];

根据我的理解,fp应该使用ceil(81/8)字节,因为它是连续的。

我说错了吗?

我如何证明这一点?

7 个答案:

答案 0 :(得分:10)

不,缓冲区的大小是实现定义的。请参阅以下标准中的引用。

因此,你可以期望的大小是81 * X,其中X是bool的大小,这是实现定义的。

$ 5.3.3 / 1 - “sizeof运算符产生其操作数的对象表示中的字节数。操作数是表达式,未计算,或带括号的type-id。sizeof运算符不得应用于具有函数或不完整类型的表达式,或者在声明其所有枚举数之前应用于枚举类型,或应用于此类型的带括号的名称,或应用于指定的左值 一个比特字段。 sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1;该 sizeof应用于任何其他基本类型(3.9.1)的结果是实现定义的。 [注意:特别是,sizeof(bool)和sizeof(wchar_t)是实现定义的.69)] [注意:对于字节的定义,请参见1.7,对于对象表示的定义,请参见3.9。 ]

答案 1 :(得分:4)

不,它的81*sizeof(bool)很可能是81字节

答案 2 :(得分:3)

您可以找到任何具有sizeof的对象或类型使用的存储空间:

int main() {
  bool fp[81];
  cout << sizeof fp << '\n';
  cout << sizeof(bool[81]) << '\n';
  return 0;
}

答案 3 :(得分:2)

不,每个bool通常是单独存储的(通常,具体取决于您的计算机,8位)。占用的内存至少为81个字节。

答案 4 :(得分:2)

您可以使用sizeof(fp)检查其大小,在我的情况下会给出81

答案 5 :(得分:1)

如果您想确保每个位都被视为一个位而不是使用整个值的字节,请使用位集:

#include <bitset>
using namespace std;
#define SIZE 1000;
int main()
{
bitset<SIZE> bit_set; // unfortunately the size of a bitset is determined at compile time
bit_set.flip();
bit_set[232] = true;
}

您必须了解这是处理器及其指令的非常低级别的内存限制,因为它们旨在支持位字而不是位。 虽然为此目的添加了一些指令本来是一件好事,因为bitset所做的只是位移......

我真的需要学习x86程序集。

答案 6 :(得分:-1)

不,bool是8位。使用vector<bool>(专门的位打包向量)或bitset