0

我编写了两个简短的测试并使用“g++ -S”(Arch Linux 上的 gcc 版本 4.7)编译:

测试1.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 显然会生成更长的代码,但我无法真正说出它们之间的区别。

一个后续问题:成员函数是否重要?

4

2 回答 2

4

这些函数是不等价的,一个按值取参数,另一个按引用取参数。请注意,如果您删除引用,&那么您将获得完全相同的功能,除了一个强制您不更改​​复制参数的值而另一个不更改。

于 2012-06-13T21:07:29.747 回答
4

const 正确性适用于人类,而不适用于代码生成

它通过对可以更改的内容引入限制,使人类更容易理解代码

所以,是的,短函数也很重要,因为它们可以从不那么短且一目了然的代码中调用

也就是说,您的示例函数并未说明 const 正确性

所以,虽然这回答了字面上的问题,但可能你误解了 const 正确性是什么,并打算问一些其他问题,我不会猜测

于 2012-06-13T21:14:01.147 回答