C++;BOOL(typedef int)与BOOL的性能对比 我在某个地方读到,使用BooL(TyPulfIt)比使用标准C++类型的BoOL要好,因为布尔的大小是4字节(即4的倍数),它将变量的对齐操作保存到寄存器中或沿着这些行……< /P>
这是真的吗?我想,即使使用bool(1字节),编译器也会填充堆栈帧以保持4的倍数对齐 我绝对不是一个关于对齐、寄存器等基本工作的专家,所以如果我完全错了,我要提前道歉。我希望得到纠正。:) 干杯 首先,C++;BOOL(typedef int)与BOOL的性能对比 我在某个地方读到,使用BooL(TyPulfIt)比使用标准C++类型的BoOL要好,因为布尔的大小是4字节(即4的倍数),它将变量的对齐操作保存到寄存器中或沿着这些行……< /P>,c++,performance,typedef,boolean,C++,Performance,Typedef,Boolean,这是真的吗?我想,即使使用bool(1字节),编译器也会填充堆栈帧以保持4的倍数对齐 我绝对不是一个关于对齐、寄存器等基本工作的专家,所以如果我完全错了,我要提前道歉。我希望得到纠正。:) 干杯 首先,sizeof(bool)不一定是1。也就是说,编译器编写器可以自由选择适合目标平台的大小 而且,sizeof(int)不一定是4 存在多个可能影响性能的问题: 对齐 存储带宽 CPU有效加载比机器字窄的值的能力 只有一个代码,才能建立一个特定的代码段,如果有任何区别,则可以通过分析代码块来建立
sizeof(bool)
不一定是1
。也就是说,编译器编写器可以自由选择适合目标平台的大小
而且,sizeof(int)
不一定是4
存在多个可能影响性能的问题:
- 对齐李>
- 存储带宽李>
- CPU有效加载比机器字窄的值的能力
只有一个代码,才能建立一个特定的代码段,如果有任何区别,则可以通过分析代码块来建立。< / P> < P>只有在C++中得到的保证大小是“<代码> char < />代码>代码>未签名CHAR< <代码>,和<代码>符号CHAR< <代码> 2),每个平台都是一个字节,并且定义为0个字节。(0)
0)尽管字节没有定义的大小
sizeof(char)
始终是1字节
,但实际上可能是40个二进制位
1)是,<代码> UTI32 32 t < /COD>和朋友,但不,它们的定义对于实际C++实现是可选的。使用它们,但如果它们不可用,可能会出现编译时错误(编译时错误总是好的)
2)
char
、unsigned char
和signed char
是不同的类型,没有定义char
是否为signed
。重载函数和编写模板时请记住这一点。对于布尔函数,有三种常见的性能驱动实践:
但是,我从未听说过用(无符号?)整数替换布尔值会提高性能。如果
bool
的速度快到4个字节,编译器会将其改为4个字节。这取决于具体情况。因此,不,BOOL
不会给性能带来好处。这是一种只有通过分析才能发现的情况,但是您是否希望BOOL的值不是0,1?即使是负值?这也不会有任何区别。编译器填充值以确保它们正确对齐。使用最有意义的类型。如果它是布尔值,则将其设置为bool
,而不是int
(或其中的一些typedef
)。编译器可能会调整bool
的大小以反映这些问题;为了便于示例,假设bool是1字节,int是4字节。假设你有一个结构{boolx;inty};x是否会因为y的大小不是4的倍数而导致y未对齐?或者编译器是否对地址进行填充以使y对齐?@KarlHansson:Padding是特定于实现的。我熟悉的实现将在x
之后插入填充,以便y
适当对齐。#3不一定正确。在结构中已经存在间隙的场景中(由于对齐/自动填充),您可以通过将布尔放置在那里来“填充”间隙以获得“自由”。假设这个结构到目前为止已经有一个大小是缓存线大小的完美倍数,那么在结构的末尾添加一个bool(而不是填充间隙)实际上会导致在某些情况下在尝试访问bool成员时缓存未命中(否则就不会有缓存未命中)。您应该独立判断每个结构。@PreetKukreti您是对的,我应该说“普遍接受的实践不需要了解底层平台”。如果您知道要在哪个平台上执行SW,那么是的,您可以知道对齐方式(4或8或…),并进行相应调整-填充孔、对齐缓存线等。我在列表中建议的是处理布尔值的一般规则。