假设我有以下 C 代码:
int i = 5;
int j = 10;
int result = i + j;
如果我循环这么多次,使用起来会更快吗int result = 5 + 10
?我经常创建临时变量以使代码更具可读性,例如,如果这两个变量是使用某些长表达式来计算索引从某个数组中获取的。这在 C 语言中性能不佳吗?其他语言呢?
现代优化编译器应该优化这些变量,例如,如果我们在godbolt with gcc
使用-std=c99 -O3
flags (现场观看):
#include <stdio.h>
void func()
{
int i = 5;
int j = 10;
int result = i + j;
printf( "%d\n", result ) ;
}
它将产生以下组件:
movl $15, %esi
用于计算i + j
,这是形式不断传播.
注意,我添加了printf
这样我们就有副作用了,否则func
会被优化为:
func:
rep ret
这些优化是允许的假设规则,只需要编译器模拟程序的可观察行为。 C99 标准草案部分涵盖了这一点5.1.2.3
程序执行其中说:
在抽象机中,所有表达式都按以下指定的方式求值
语义。实际的实现不需要评估一部分
表达式,如果它可以推断出它的值没有被使用并且没有
产生所需的副作用(包括因调用
函数或访问易失性对象)。
另请参阅:优化 C++ 代码:常量折叠
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)