C++ C+中的比较运算符+;
关于C++中的比较运算符,我有两个问题:C++ C+中的比较运算符+;,c++,C++,关于C++中的比较运算符,我有两个问题: 循环时,两种方式中的哪一种更有效(类型mdata和mfirst\u free也是double*): for(double*p=mdata;p
mdata
和mfirst\u free
也是double*
):for(double*p=mdata;p
for(double*p=mdata;p!=mfirst_free;++p){..}
我猜同样的答案对于所有的原语类型都是有效的-int
、double
和指针。对吗?我知道,
像往常一样,请自己查看并查看生成的代码。使用Ubuntu 14.04上的g++4.8,您可以
movq -16(%rbp), %rax
movq %rax, -32(%rbp)
jmp .L2
.L3:
addq $8, -32(%rbp)
.L2:
movq -32(%rbp), %rax
cmpq -8(%rbp), %rax
jb .L3
正如您所看到的,唯一相关的区别是jb.L3
vsjne.L5
因此,我想说,从性能的角度来看,这两种方法是等效的
回答第二个问题,比较所需的最小值是运算符(常数T&x,常数T&y){
返回y
当然,只有当你有通常的比较语义时,这才是正确的。据我所知,这真的没有什么区别。我相信
p != mfirst_free
将在汇编中转换为类似于
loop
CMP p mfirst_free
BEQ exit
{...body...}
B loop
exit
而
p < mfirst_free
p
将转换为相同的,但不是BEQ指令,而是BGE指令。执行相同数量的指令将花费相同的时间
-有多种方法可以将for循环转换为assembly,但我的观点是,据我所知,您使用的每个比较运算符都会导致相同的运行时间。-首先,在纯C++术语中,没有问题的正确答案,因为标准没有指定它,它留给编译器和CPU的自由度。
实际上,您要问的是,“分支如果不相等”指令所用的时间是否比“分支如果较少”指令所用的时间少。在我遇到的所有CPU中,答案都是“否”-前提是您不会因为错误的分支预测而误入歧途。如果计数器变量是整数或指针,则效率可能没有差异。只要变量刚刚递增(1),并且开始时小于或等于结束值,效果就相同
<>但是C++的迭代器不一定要执行OffATORI,比较双打的指针,而不是加倍。它在double数组上循环,没有将边界保持为整数,但也作为指针。很抱歉,我没有发现它。但是,我不认为问什么更有效率是无用的。对于第二个问题,(1)我认为你的意思是“有效”,而不是“有效”,以及(2)这很大程度上取决于您是否使用C++标准库的库设施,原因不明的原因是使用<代码>运算符>代码> S/I。因为实际上整数溢出通常是可以忽略的,所以它通常只是一个减法。然而,标准库只增加了对从操作符推断其他操作符的支持。或者“这真的很重要”,你打算在其中包含“不”吗?天哪,我的错。是的,它应该是一个“不”字。我之所以接受它,是因为它的使用技巧很棒,但Olaf编辑了答案,只完整地回答了我的问题。不管怎么说,Thanx给小费太多了!
loop
CMP p mfirst_free
BEQ exit
{...body...}
B loop
exit
p < mfirst_free
#pragma omp parallel for
for(auto it = std::begin(values); it < std::end(values); ++it)