2012-07-11 68 views
2

检查'< ='而不是'>'是否更昂贵?C++优化,使用>而不是<=

第一个检查<和==,但'>'只做一次检查。

或者,也许编译器优化呢?

+12

它是你的瓶颈? – Andrew 2012-07-11 11:20:56

+3

这更像是他的好奇心和完美主义,这是相当不错的。 – 2012-07-11 11:27:51

+5

@DesmondHume:我不同意这里。如果你想写汇编器学习指令并且知道细节,如果你想用更高级的语言编写,让编译器/优化器来完成它的工作。如果两个表达式中的一个比另一个表达式昂贵,编译器可以按照程序员可以将其转换为另一个。其优点是编译器**确实知道表达式的成本以及在生成的代码上下文中的重要程度。编译器在优化细节方面通常会比普通程序员做得好得多。 – 2012-07-11 12:29:01

回答

15

这取决于你在比较什么,但对于内置类型,两者通常只是一个机器指令。

4

很少有任何明显的差异。如果你正在考虑这种优化,我敢打赌,你没有优化正确的事情。

3

对于非内建类型,你可以重载无论是运营商,如你所愿:

如果
class Foo 
{ 
public:  
    bool operator<=(const Foo &other) const 
    { 

    } 

    bool operator<(const Foo &other) const 
    { 

    } 

}; 

所以比较操作是你可以优化你的运营商和<=可以用不同的方式来计算应用程序的瓶颈然后拨打<==

+0

这个答案的重点是? – 2012-07-11 11:39:28

+0

@AlexeyFrunze:关键是<=可以通过另一种方式实现,然后调用<和== – Andrew 2012-07-11 11:44:12

+0

这是值得详细阐述和写在答案,我认为。 – 2012-07-11 11:45:52

0

编号都有相同的成本。假设你使用的是已知的标准编译器不会看上一个

+0

编译器甚至不应该担心,它们两者在机器级应该具有相同的成本 – eds 2012-07-11 11:40:21

0

<=是基本相同>一个额外NOT和>=相同<用NOT。 (哪些,如果有的话,有额外的不,我不确定,但他们在硬件水平基本上是一样的。)

+1

在大多数处理器中,结果将是一个比较指令,它在条件代码中设置一些标志,然后在条件代码上设置一个条件跳转条件代码。不管比较结果如何,我不知道任何需要额外的处理器的情况;他们都有对应所有六个运营商的条件跳转运营商。 – 2012-07-11 15:11:59

+0

这假定整数类型或类似。对于浮点,'a <= b'与''不一样! (A> B)'。例如,如果'a'是NaN,前者是假的,但后者是真的。 – 2012-07-12 14:05:47

相关问题