Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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+中的代码优化+;_C++_C - Fatal编程技术网

C++ C和C+中的代码优化+;

C++ C和C+中的代码优化+;,c++,c,C++,C,以下两个代码段之间是否有任何优化 案例1: int func() { int a = 10; return a; } int func() { return 10; } 第一种情况为函数中的变量赋值,然后返回该变量 案例2: int func() { int a = 10; return a; } int func() { return 10; } 第二个函数直接返回值 另外,哪一个更快?任何合理的编译器都应该为这两种情况构建基本相同的代码

以下两个代码段之间是否有任何优化

案例1:

int func()
{
    int a = 10;
    return a;
}
int func()
{
    return 10;
}
第一种情况为函数中的变量赋值,然后返回该变量

案例2:

int func()
{
    int a = 10;
    return a;
}
int func()
{
    return 10;
}
第二个函数直接返回值


另外,哪一个更快?

任何合理的编译器都应该为这两种情况构建基本相同的代码。

这两个函数都会生成与任何半体面编译器相同的机器代码。优化局部临时变量是编译器自20世纪80年代以来所能做的事情

这就是为什么使用局部变量来提高复杂表达式的可读性是一个好主意。在您的情况下,局部变量只是多余的。

如果启用了
-O1
(或更高)开关,两个代码段将生成相同的程序集

func():
        mov     eax, 10
        ret

因此,就性能而言,这两个代码段是相同的。

对于像
int
这样的简单类型,几乎可以肯定在性能上没有任何区别。正如其他人指出的那样,汇编程序也是一样的

对于C++中的复杂类型,答案更细微,可以依赖于复制删除和移动语义的使用。在实现几乎可以用任何类型实例化的模板时,这一点尤其值得考虑


(比如)std::vector的良好实现非常小心,不要创建需要分配或移动的不必要副本。

这不是一个很好的问题。太广泛了……首先,没有所谓的C/C++语言。第二,测试一下,不同的是第一个不会compile@tobi303也许在ANSI C中没有,但那是非常古老的,对吗?@Zereges打字错误在同一时间被修复了,不确定你在第一个版本中修复了打字错误后的意思:POK,我错过了什么?我可以问一下DVs的解释吗?我也很好奇。缺乏对理由的解释?@宋元耀不确定,但我不确定它是如何缺乏的。这两个代码段生成相同的程序集,因此没有区别。DVs的原因是什么?(+3/-3),我真的很惊讶。我没有DV,但我认为这是因为答案只适用于特定的编译器和体系结构,并没有断言这样的微观优化在一般层面上是毫无意义的。“像int这样的原子类型”-原子类型应该是
std::atomic
。不能保证纯
int
是原子的。@MSalters公平点。这是一个令人困惑的术语。我指的是内置的基本类型,比如
int
。编辑。