Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;BOOL(typedef int)与BOOL的性能对比 我在某个地方读到,使用BooL(TyPulfIt)比使用标准C++类型的BoOL要好,因为布尔的大小是4字节(即4的倍数),它将变量的对齐操作保存到寄存器中或沿着这些行……< /P>_C++_Performance_Typedef_Boolean - Fatal编程技术网

C++;BOOL(typedef int)与BOOL的性能对比 我在某个地方读到,使用BooL(TyPulfIt)比使用标准C++类型的BoOL要好,因为布尔的大小是4字节(即4的倍数),它将变量的对齐操作保存到寄存器中或沿着这些行……< /P>

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有效加载比机器字窄的值的能力 只有一个代码,才能建立一个特定的代码段,如果有任何区别,则可以通过分析代码块来建立

这是真的吗?我想,即使使用bool(1字节),编译器也会填充堆栈帧以保持4的倍数对齐

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

干杯

首先,
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
。重载函数和编写模板时请记住这一点。

对于布尔函数,有三种常见的性能驱动实践:

  • 在if语句中,检查表达式的顺序很重要,需要小心
  • 如果对布尔表达式的检查导致大量分支预测失误,那么(如果可能的话)应该用一个小技巧来代替
  • 由于boolean是最小的数据类型,所以布尔变量应该在结构和类中声明为最后一个,这样填充就不会在结构内存布局中添加明显的漏洞

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

    如果
    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或…),并进行相应调整-填充孔、对齐缓存线等。我在列表中建议的是处理布尔值的一般规则。