Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++ C+中的比较运算符+;_C++ - Fatal编程技术网

C++ C+中的比较运算符+;

C++ C+中的比较运算符+;,c++,C++,关于C++中的比较运算符,我有两个问题: 循环时,两种方式中的哪一种更有效(类型mdata和mfirst\u free也是double*): for(double*p=mdata;p

关于C++中的比较运算符,我有两个问题:

  • 循环时,两种方式中的哪一种更有效(类型
    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
    vs
    jne.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)