我写过两个简短的测试,并用“g ++ -S”(Arch Linux上的gcc 4.7版)编译:
test1.cpp
inline int func(int a, int b) {
return a+b;
}
int main() {
int c = func(5,5);
return 0;
}
测试2.cpp
inline int func(const int& a, const int& b) {
return a+b;
}
int main() {
int c = func(5,5);
return 0;
}
diff test1.s test2.s
1,5c1,5
< .file "test1.cpp"
< .section .text._Z4funcii,"axG",@progbits,_Z4funcii,comdat
< .weak _Z4funcii
< .type _Z4funcii, @function
< _Z4funcii:
---
> .file "test2.cpp"
> .section .text._Z4funcRKiS0_,"axG",@progbits,_Z4funcRKiS0_,comdat
> .weak _Z4funcRKiS0_
> .type _Z4funcRKiS0_, @function
> _Z4funcRKiS0_:
12a13,14
> movl 8(%ebp), %eax
> movl (%eax), %edx
14c16
< movl 8(%ebp), %edx
---
> movl (%eax), %eax
22c24
< .size _Z4funcii, .-_Z4funcii
---
> .size _Z4funcRKiS0_, .-_Z4funcRKiS0_
36,38c38,44
< movl $5, 4(%esp)
< movl $5, (%esp)
< call _Z4funcii
---
> movl $5, 20(%esp)
> movl $5, 24(%esp)
> leal 20(%esp), %eax
> movl %eax, 4(%esp)
> leal 24(%esp), %eax
> movl %eax, (%esp)
> call _Z4funcRKiS0_
但是,我真的不知道如何解释结果。我只看到test2显然产生了更长的代码,但我无法确定它们之间存在什么差异。
后续问题:成员函数是否重要?
答案 0 :(得分:4)
这些函数不等价,一个按值引用参数,另一个按引用引用。请注意,如果您删除引用&
,那么您将使用完全相同的函数,除了强制您不更改复制参数的值而另一个不更改。
答案 1 :(得分:4)
const正确性适用于人类,而不适用于代码生成
通过引入可以改变的限制
,人类更容易理解代码所以,是的,它对于短函数也很重要,因为它们可以从代码中调用,而不是简单易懂,一目了然
说,你的示例函数没有说明const正确性
所以,虽然这回答了字面上的问题,但可能你误解了const正确性是什么,并且想要问一些其他问题,我将不会猜测