为什么我们不通过函数中的引用传递POD?

xcr*_*ypt 3 c++

我一直被告知我们不应该通过参考传递POD.但最近我发现一个引用实际上根本没有内存.

那么为什么我们选择写:

void DoSomething(int iNumber);
Run Code Online (Sandbox Code Playgroud)

代替:

void DoSomething(const int& riNumber);
Run Code Online (Sandbox Code Playgroud)

是不是更有效率?

Tru*_*eon 7

实际上在这种情况下(使用int)传递值可能更有效,因为只需要1个内存读取而不是2来访问传递的值.

示例(使用-O2优化):

int gl = 0;

void f1(int i)
{
    gl = i + 1;
}

void f2(const int& r)
{
    gl = r + 1;
}

int main()
{
    f1(1);

    f2(1);
}
Run Code Online (Sandbox Code Playgroud)

ASM

    .file   "main.cpp"
    .text
    .p2align 2,,3
.globl __Z2f1i
    .def    __Z2f1i;    .scl    2;  .type   32; .endef
__Z2f1i:
LFB0:
    pushl   %ebp
LCFI0:
    movl    %esp, %ebp
LCFI1:
    movl    8(%ebp), %eax
    incl    %eax
    movl    %eax, _gl
    leave
    ret
LFE0:
    .p2align 2,,3
.globl __Z2f2RKi
    .def    __Z2f2RKi;  .scl    2;  .type   32; .endef
__Z2f2RKi:
LFB1:
    pushl   %ebp
LCFI2:
    movl    %esp, %ebp
LCFI3:
    movl    8(%ebp), %eax
    movl    (%eax), %eax
    incl    %eax
    movl    %eax, _gl
    leave
    ret
LFE1:
    .def    ___main;    .scl    2;  .type   32; .endef
    .p2align 2,,3
.globl _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
LFB2:
    pushl   %ebp
LCFI4:
    movl    %esp, %ebp
LCFI5:
    andl    $-16, %esp
LCFI6:
    call    ___main
    movl    $2, _gl
    xorl    %eax, %eax
    leave
    ret
LFE2:
.globl _gl
    .bss
    .align 4
_gl:
    .space 4
Run Code Online (Sandbox Code Playgroud)

  • @xcrypt:如果引用在本地使用它引用的值,并且只是另一个变量的别名,那么您的教师语句是正确的.但是当你在没有概念的函数之间传递东西时,你需要传递一些代表原始对象的东西(在内部通常是一个指针). (2认同)