C:从函数返回值是否比空值花费更多的CPU周期?

时间:2018-07-13 21:38:48

标签: c function return-value cpu-usage

如果在C语言中使用void函数与返回任意类型(例如int)的函数相比,int函数会比void函数花费更多的CPU周期吗?

示例:

int a, b = 1, c = 2;

void f()
{
     a = b + c;
}

int g()
{
     a = b + c;
     return a;
}

我的常识告诉我,返回是一个动作,因此它应该花费一些CPU时间,但是我没有这里所需要的适当的基础知识,也不知道汇编程序会自信地回答这个问题我自己。谷歌搜索也不成功。

编辑: 我的兴趣纯粹是学术上的,我不希望通过使用void vs int函数获得任何显着(甚至接近该水平)的性能。

4 个答案:

答案 0 :(得分:5)

这完全取决于CPU指令集和调用约定。

例如,如果返回值总是在特定寄存器中返回,并且编译器可以在插入返回指令之前将计算b + c的结果安排在该特定寄存器中,这两个代码生成的代码功能可能相同。

但是,除非您用尽所有其他选项来提高性能,否则您不希望在程序中进行优化。而且您当然没有。

答案 1 :(得分:3)

我认为这个问题没有多大意义。

如果需要返回的值,即使更快,您也无法选择使用void来加速它。
如果您不需要结果,则返回它毫无用处,所以就不要这样做。 无论哪种方式,选择都是由呼叫者的需求决定的。

通常,现代编译器不返回值,而是就地构造它。例如,如果您编写int sum = f(a,b);,则编译器将永远不会在函数中创建临时文件,而是使用sum的内存来存储结果。这意味着执行时间没有差异。

答案 2 :(得分:3)

在x86_64系统上,两个函数都可以编译为相同的代码。我已经用大致等效的C代码“反汇编了”:

f_or_g:
    pushq   %rbp                 ; // Standard stack frame setup
    movq    %rsp, %rbp           ; // same
    movl    OFFSET1(%rip), %eax  ; eax = c;
    addl    OFFSET2(%rip), %eax  ; eax += b;
    movq    OFFSET3(%rip), %rcx  ; rcx = &a;
    movl    %eax, (%rcx)         ; *rcx = eax;
    popq    %rbp                 ; // Standard stack frame teardown
    retq                         ; return

由于x86_64使用eax作为32位值的返回寄存器,所以相加的结果已经在“正确的位置”以返回它-不需要额外的代码。

在更复杂的函数中,可能需要一些较小的开销才能确保返回值最终存储在正确的寄存器中。不过,一般而言,该开销应该很小。

相同的原理也适用于大多数其他体系结构-这并非特定于x86_64;我正在使用它,因为这是第一个使用的编译器。

答案 3 :(得分:0)

我们不能说是否会有额外的循环使用,因为它完全取决于您的处理器或cpu,此外,如果您需要返回值,那么return语句仅访问该元素的内存位置,因此可能仅存在复杂度的微小变化可以忽略不计。