7

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

有没有道理呢?我想即使您使用 bool(1 字节),编译器也会填充堆栈帧以保持 4 的倍数对齐?

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

干杯!

4

3 回答 3

8

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

另外,sizeof(int)也不一定4

有多个问题可能会影响性能:

  • 结盟;
  • 内存带宽;
  • CPU 有效加载比机器字窄的值的能力。

对特定代码段的影响(如果有的话)只能通过分析该段代码来确定。

于 2012-05-09T08:05:25.273 回答
2

您可以在 C++ 中获得的唯一保证大小是 with charunsigned charsigned char 2),它们总是正好是一个字节,并为每个平台定义。0) 1)


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

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

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

于 2012-05-09T11:42:09.510 回答
0

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

  1. 在 if 语句中,检查表达式的顺序很重要,需要注意它们。
  2. 如果对布尔表达式的检查导致很多分支错误预测,那么它应该(如果可能的话)用一些小技巧来代替。
  3. 由于 boolean 是最小的数据类型,因此 boolean 变量应该在结构体和类中最后声明,这样填充就不会在结构体内存布局中添加明显的漏洞。

但是,我从未听说过用(无符号?)整数替换布尔值会带来任何性能提升。

于 2012-05-11T10:21:50.540 回答