c++ - 分配临时变量或计算表达式两次

标签 c++ c

<分区>

我正在尝试编写尽可能高效的代码,但遇到了以下情况:

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

如您所见,看不到任何地方!

关于c++ - 分配临时变量或计算表达式两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37035483/

相关文章:

c++ - 非静态字符串的字符串到 char* 的转换失败

c++ - 检查指针是否指向 vector 元素

c++ - C++ 中用 & 和 * 声明的函数参数的区别

c - 打开文件时出现段错误

c - x86-如何使用内联汇编中的for循环将值插入数组

c++ - iterator 和 back_insert_iterator 有什么区别?

c++ - 链接时不同静态库中的相同目标文件

android - 如何在Android中获取#define的值

c - 如何更改 gdb 中的值

c - 函数内的 C 缓冲区 calloc 或 malloc 不能保证安全?