我正在尝试编写尽可能高效的代码,但遇到了以下情况:
int foo(int a, int b, int c)
{
return (a + b) % c;
}
一切顺利!但是,如果我想检查表达式的结果是否与常量不同,可以说 myConst
。可以说我买得起一个临时变量。
以下哪种方法最快:
int foo(int a, int b, int c)
{
return (((a + b) % c) != myConst) ? (a + b) % c : myException;
}
或
int foo(int a, int b, int c)
{
int tmp = (a + b) % c
return (tmp != myConst) ? tmp : myException;
}
我不能决定。重新计算比分配和取消分配临时变量或其他方式更昂贵的“线”在哪里。
别担心,编写简洁的代码并将微优化留给编译器。
在您的示例中,两次编写相同的计算很容易出错 - 所以不要这样做。在您的特定示例中,编译器很可能完全避免在堆栈上创建临时文件!
您的示例可以(在我的编译器上执行)生成以下程序集(我已将 myConst
替换为 constexpr
42 并将 myException
替换为 0):
foo(int, int, int):
leal (%rdi,%rsi), %eax # this adds a and b, puts result to eax
movl %edx, %ecx # loads c
cltd
idivl %ecx # performs division, puts result into edx
movl $0, %eax #, prepares to return exception value
cmpl $42, %edx #, compares result of division with magic const
cmovne %edx, %eax # overwrites pessimized exception if all is cool
ret
如您所见,看不到任何地方!