C++ 阵列C+中每布尔1位+;

C++ 阵列C+中每布尔1位+;,c++,arrays,sizeof,boolean,C++,Arrays,Sizeof,Boolean,根据我的理解,fp应该使用ceil(81/8)字节,因为它是连续的 我说得对吗 我如何证明这一点呢?不,一个bool是8位。使用向量(专用位压缩向量)或位集否,每个布尔值通常单独存储(通常,取决于您的计算机,8位)。占用的内存最少为81字节。否,其81*sizeof(bool)最有可能为81字节。您可以找到任何具有sizeof的对象或类型使用的存储空间: bool fp[81]; intmain(){ bool-fp[81]; cout您可以使用sizeof(fp)检查其大小,在我的例子中,它

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

我说得对吗


我如何证明这一点呢?

不,一个
bool
是8位。使用
向量
(专用位压缩向量)或
位集

否,每个布尔值通常单独存储(通常,取决于您的计算机,8位)。占用的内存最少为81字节。

否,其
81*sizeof(bool)
最有可能为81字节。

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

bool fp[81];
intmain(){
bool-fp[81];

cout您可以使用
sizeof(fp)
检查其大小,在我的例子中,它给出81

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

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

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

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

int main() {
  bool fp[81];
  cout << sizeof fp << '\n';
  cout << sizeof(bool[81]) << '\n';
  return 0;
}
#包括
使用名称空间std;
#定义大小1000;
int main()
{
bitset bit_set;//不幸的是,位集的大小是在编译时确定的
bit_set.flip();
位设置[232]=真;
}
您必须理解这是处理器及其指令的一个非常低级别的内存限制,因为它们被设计为支持位字,而不是位字。 不过,如果为此目的添加了一些指令,那将是一件好事,因为位集所做的只是位移位


我真的需要学习x86汇编。

或boost::dynamic_位集,因为向量是邪恶的。@Johnny:这不是真的。Bool的8位是不保证的。-1不,
Bool
的大小是实现定义的,不一定是8位。但是
Bool
的大小保证至少是
CHAR_位
位。C(++)除了位字段,不进行位打包。注意,这只报告实际对象的大小,而不报告它控制的任何资源的大小,例如动态分配的内存:sizeof(std::string)是常量,即使应用于不同长度的字符串也是如此。这是正确的,但忽略了一个关键点,即
sizeof(bool)
必须大于或等于
sizeof(char)
,因为
sizeof(char)
定义为1。[是的,这意味着在位寻址机器上实现一致的C实现将非常困难。]因此,无论缓冲区的大小如何,它必须至少为81;它不能是ceil(81/8)。
#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;
}