Passing arguments to functions with const parameters: is it faster?

前端 未结 4 693
盖世英雄少女心
盖世英雄少女心 2021-02-07 00:32

Consider, for example:

int sum(int a, int b)
{
    return a + b;
}

vs.

int sum(const int a, const int b)
{
    return a + b;
}
         


        
4条回答
  •  日久生厌
    2021-02-07 00:56

    Short answer: No

    Long answer, no, with proof.

    I ran this test, a couple of times, and saw no real time difference, on my MacBook pro compiled with clang:

    int add(int a, int b)
    {
        return a + b;
    }
    
    const int cadd(const int a, const int b)
    {
        return a + b;
    }
    
    int main (int argc, char * argv[])
    {
    #define ITERS 1000000000
    
        clock_t start = clock();
        int j = 0;
        for (int i = 0; i < ITERS; i++)
        {
            j += add(i, i + 1);
        }
    
        printf("add took %li ticks\n", clock() - start);
    
        start = clock();
        j = 0;
        for (int i = 0; i < ITERS; i++)
        {
            j += cadd(i, i + 1);
        }
    
        printf("cadd took %li ticks\n", clock() - start);
    
        return 0;
    }
    

    Output

    add took 4875711 ticks
    cadd took 4885519 ticks
    

    These times really should be taken with a grain of salt, however, as clock isn't the most accurate of timing functions, and can be influenced by other running programs.

    So, here is the compared assembly generated:

    _add:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register %rbp
        movl    %edi, -4(%rbp)
        movl    %esi, -8(%rbp)
        movl    -4(%rbp), %esi
        addl    -8(%rbp), %esi
        movl    %esi, %eax
        popq    %rbp
        ret
    
    _cadd:                                 
        .cfi_startproc    
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register %rbp
        movl    %edi, -4(%rbp)
        movl    %esi, -8(%rbp)
        movl    -4(%rbp), %esi
        addl    -8(%rbp), %esi
        movl    %esi, %eax
        popq    %rb
    

    So, as you can see, there is No difference between the two. Passing an argument as const is only a hint to the caller the the argument will not be changed, and in a simple scenario like the one described above, will not result in any different assembly compiled.

提交回复
热议问题