确实
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的情况下进行更改。这个内存的两倍是内存中只有一个吗?
答案 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>