布尔测试
如果使用VS 2010,则为sizeof(test) = 1。由于每种C ++数据类型都必须可寻址,
" test"布尔变量为8位(1字节)。
我的问题是," test"变量是否真的占用了内存中的1个字节?
有什么实现技巧可以使bool数据类型仅占据
一点? 如果可以,可以举个例子吗?
bool test1[32](在VS 2010中),
int test2(在VS 2010中)
test1和test2是否占用相同的内存?
让我强调一下,当对速度进行超优化时,平台在4位字节的32位计算机上存储布尔值可能是合理的。 然后,如果您在一个结构中有4个布尔值,则只需要执行一次ALU操作即可检查布尔值是否为真,而在一个机器字中有许多布尔值时,则只需两个ALU操作。 (Ofc这样小的差异通常根本不重要。)
某些嵌入式处理器实际上具有位可寻址内存,因此bool变量可以占用一位。
test1的每个元素都必须是可寻址的。 这意味着test1至少占用32个字节(而不是位)。
如果要将多个布尔值存储在单个变量中,请使用std::bitset或std::vector(但请注意,后者并不是真正的布尔向量,这是一种旨在节省空间的专业化方法)。
IIRC,C ++ 11也定义了std::dynamic_bitset。
你的意思可能是32位而不是字节
如果处理器具有8位可寻址单元,则意味着bool必须占用1个八位字节(字节),而不是4个(32位)。 是的,那里仍然有8位可寻址系统。 ARM9可以访问8或32位值。
@ entity64:test1是32个可寻址的bool对象的数组,这些对象将(至少)需要32个字节,每个对象一个。
h! -没看到。 对不起:-)
@ entity64:不,我的意思是32个字节,其中一个字节是C ++标准规定的最小存储单位(不一定是8位)。
2年后...是的,没错,dynamic_bitset。 感谢您,!
My question is that does the"test" variable really occupy 1 byte in memory?
是的,如果sizeof(bool)==1。 基本上,bool的大小是实现定义的,这意味着对于某些编译器,它可以大于1个字节。
bool test1[32](in VS 2010), int test2(in VS 2010)
Does test1 and test2 occupy the same memory?
通过使用sizeof运算符,可以知道它们各自占据什么。 那就是sizeof运算符的用途。 因此test1和test2将分别占据sizeof(test1)和sizeof(test2)字节。
变量为1位的另一种可能性是放入位域结构:
struct {
int a:1;
int b:1;
};
应该不是unsigned a : 1吗?
好吧,我确定我以这种方式使用了它,尽管我从未将其视为1位带符号整数,所以您在这里有个要点。