传递值是否为整数使用更多内存?

时间:2014-05-28 21:10:17

标签: c

确实

int add(int x);
int main()
{
    int x = 1;
    add(x);
}
int add(int x)
{
    return x + 2;
}

使用比

更多的内存
int add(int x);
int main()
{
    x = 1;
    x + 2;
}

什么时候跑?

add函数在其作用域中创建一个新变量x,可以在不影响外部x的情况下进行更改。这个内存的两倍是内存中只有一个吗?

2 个答案:

答案 0 :(得分:1)

(我不会质疑你为什么要创建一个在x上添加2的值然后抛弃该值而不在两种情况下都做任何事情,因为这可能只是一个简单的例子。 )

如果编译器没有捕获并优化它,是的,这将为函数参数和返回值分配额外的内存。

另外,如果它没有被编译器优化,这也可能导致第一个程序运行稍慢(这可能在你所讨论的for循环中很明显,这取决于循环的持续时间) for),因为编译后的代码需要将参数传递给函数并将返回值传递回main(添加一些额外的指令,这些指令将在循环的每次迭代中执行)。

我很确定这两个问题都可以通过大多数编译器的非常简单的优化来解决。

答案 1 :(得分:-2)

使用gcc编译时,第一个代码段将产生更大的内存占用,而不指定任何明确的优化。

使用gcc -S生成的第一个程序和程序集:

int add(int x);
int main()
{
    int x = 1;
    add(x);
}
int add(int x)
{
    return x + 2;
}



    .file   "test.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movl    $1, -4(%rbp)
    movl    -4(%rbp), %eax
    movl    %eax, %edi
    call    add
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .globl  add
    .type   add, @function
add:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    %edi, -4(%rbp)
    movl    -4(%rbp), %eax
    addl    $2, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size   add, .-add
    .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
    .section    .note.GNU-stack,"",@progbits

第二个程序(稍微修改以便编译)和使用gcc -S生成的程序集:

int add(int x);
int main()
{
    int x = 1;
    x + 2;
}


    .file   "test2.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $1, -4(%rbp)
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
    .section    .note.GNU-stack,"",@progbits

可以看出,第一个程序包含add函数的代码,main()设置要添加的函数调用,这实际上将使用更多的程序执行堆栈而不是没有调用。 / p>