C ++ BOOL(typedef int)vs bool表现

时间:2012-05-09 08:02:58

标签: c++ performance typedef boolean

我在某处读到使用BOOL(typedef int)比使用标准c ++类型bool更好,因为BOOL的大小是4个字节(即4的倍数)并且它将变量的对齐操作保存到寄存器或其他东西中线...

这有什么道理吗?我想编译器会填充堆栈帧,以便即使你使用bool(1个字节)也能保持多个4的对齐?

我绝不是对齐,寄存器等基础工作的专家,所以如果我完全错了,我会提前道歉。我希望得到纠正。 :)

干杯!

3 个答案:

答案 0 :(得分:7)

首先,sizeof(bool)不一定是1。它是implementation-defined,使编译器编写者可以自由选择适合目标平台的大小。

此外,sizeof(int)不一定是4

有多个问题可能会影响效果:

  • 对准;
  • 内存带宽;
  • CPU能够有效加载比机器字更窄的值。

什么 - 如果有的话 - 只能通过分析那段代码来建立对特定代码片段的差异。

答案 1 :(得分:2)

您可以在C ++中获得的唯一保证大小是charunsigned charsigned char 2),它们始终只是一个字节并已定义对于每个平台。 0) 1)


0)虽然一个字节没有定义的大小。 sizeof(char)始终为1 byte,但实际上可能是40个二进制位

1)是的,有uint32_t和朋友,但不,他们的定义对于实际的C ++实现是可选的。使用它们,但如果它们不可用,您可能会遇到编译时错误(编译时错误总是很好)

2)charunsigned charsigned char是不同的类型,并且未定义char是否为signed。在重载函数和编写模板时请记住这一点。

答案 2 :(得分:0)

关于布尔值,有三种普遍接受的绩效驱动实践:

  1. 在if语句中检查表达式的顺序很重要,需要注意它们。
  2. 如果检查一个布尔表达式会导致很多分支错误预测,那么它应该(如果可能的话)被一个小错误的黑客代替。
  3. 由于布尔值是最小的数据类型,因此布尔变量应在结构和类中声明为最后一个,因此填充不会在结构内存布局中添加明显的漏洞。
  4. 然而,我从来没有听说过使用(unsigned?)整数替换布尔值会带来任何性能提升。