Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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,在数字比较函数中,我们可以使用if子句,一个是use if else,另一个是直接使用return。因为如果它不返回大的,另一个肯定是大的 现在的问题是:哪个更有效?我测试了一个计时函数,它无法区分 方法A: int getmax(int a,int b){ if (a>b)return a; else return b; } 方法B: int getmax(int a,int b){ if (a>b)return a; return b; } 很抱歉让你们中的一

在数字比较函数中,我们可以使用if子句,一个是use if else,另一个是直接使用return。因为如果它不返回大的,另一个肯定是大的

现在的问题是:哪个更有效?我测试了一个计时函数,它无法区分

方法A:

int getmax(int a,int b){
  if (a>b)return a;
  else return b;
}
方法B:

int getmax(int a,int b){
  if (a>b)return a;
  return b;
}

很抱歉让你们中的一些人不高兴。我有这个问题是因为我想知道else条款对时间的影响。else条款会花费更多的时间吗?虽然我在for循环中运行了100000000次,但这似乎是一个随机效率。

我看不出这样的比较有什么意义,但如果您真的很好奇,让我们比较一下VC11生成的程序集:

int getmax_1(int a,int b)
{
    if (a>b)
        return a;
    else
        return b;
}

int getmax_2(int a,int b)
{
    if (a>b)
        return a;

    return b;
}
getmax_1

    if (a>b)
002017BE  mov         eax,dword ptr [a]  
002017C1  cmp         eax,dword ptr [b]  
002017C4  jle         getmax_1+2Dh (02017CDh)  
    return a;
002017C6  mov         eax,dword ptr [a]  
002017C9  jmp         getmax_1+30h (02017D0h)  
    else
002017CB  jmp         getmax_1+30h (02017D0h)  
    return b;
002017CD  mov         eax,dword ptr [b]
getmax_2

    if (a>b)
002017FE  mov         eax,dword ptr [a]  
00201801  cmp         eax,dword ptr [b]  
00201804  jle         getmax_2+2Bh (020180Bh)  
    return a;
00201806  mov         eax,dword ptr [a]  
00201809  jmp         getmax_2+2Eh (020180Eh)  
    return b;
0020180B  mov         eax,dword ptr [b]  
然而,这是一个调试构建。在发布版本中,这两个调用肯定是内联的,第二个函数中的附加调用可能会被消除


所以。。。没有区别,真的。

我强烈建议使用第二个选项,因为它基本上做相同的事情,但没有任何额外的代码。你可以这样看:


函数在
return
语句处转义,并可能返回指定的值。话虽如此,在
if
语句之后转义函数已经是一个好主意,这没有什么错。
if
后面的
return
语句将退出函数,不考虑其后的任何代码。这意味着
else
是不必要的,只是编译器的额外工作,而不是必需的

绝对没有区别。
else
子句不生成任何可执行代码。在机器指令级,只存在到给定地址的有条件和无条件分支。在C语言中有种
goto

因此,两个函数的执行方式如下:

    if (a > b) goto label_1;
    return_register = b;
    goto label_2;
label_1:
    return_register = a;
label_2:
    return return_register;

在我看来,你问过在C或C++领域中,一个或另一个是否有效。说:

在抽象机器中,所有表达式都按照语义指定的方式进行计算。一 如果可以推断表达式的 未使用该值,且未产生所需的副作用(包括由 调用函数或访问易失性对象)

<> C++标准有类似之处。 由于我们缺少关于实际实现的关键细节(比如一段代码是否为非最优,另一段代码是否为最优),并且标准没有规定什么是有效的,因此您的问题没有明确的答案。。。至少,在C或C++领域中不是这样。您必须标记编译器是什么,而不是[c]和[c++]

其他可能影响程序效率的因素有。。。好节目!众所周知,随着代码和数据的增长,缓存丢失的风险也随之增加。出于这个原因,您可能不应该单独测试这段代码:它不会带来任何有意义的结果,因为在您更改某些内容时,这些数字会发生变化

因此,我们通常避免过早的优化,主要是通过易读易写的代码来解决实际问题。一旦你找到了现实问题的解决方案(并且得到了老板的许可或要求对其进行优化),使用你的档案器确定哪些是最重要的瓶颈,并尝试对其进行优化

如果您试图在其他任何地方进行优化,特别是通过引入额外的代码或数据来减少其他地方的代码或数据,那么您可能会将更重要的优化推到您无法企及的地方

一旦优化了最重要的瓶颈,请再次使用探查器以确保优化成功,并确定可以优化的其他方面


这很可能会挽救你的工作,有一天…

如果他们是平等的呢?我想你不需要知道这些吧?我认为这没什么区别。试着用计时器运行它们数亿次。计时器在循环之外。这取决于编译器,任何非愚蠢的编译器都会生成完全相同的代码。如果使用三元运算符呢?但我认为像@teppic一样,编译器非常聪明!您不能使用任何比较
返回a^((b^a)和-(b
:)我只是通过gcc运行了它-那里完全相同的程序集。有趣的是,VC11输出中的第二个jmp将永远不会执行。它的唯一效果是在机器代码中消耗2字节的空间。