0

2 つの短いテストを作成し、両方を "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;
}

test2.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

これらの関数は同等ではありません。1 つは引数を値で受け取り、もう 1 つは参照で受け取ります。参照を削除すると、まったく同じ関数が残ることに注意してください&。ただし、コピーされた引数の値を変更しないことを強制するものと、変更しないものがあります。

于 2012-06-13T21:07:29.747 に答える
4

const の正確性はコード生成用ではなく、人間用です

変更できるものに制約を導入することで、人間がコードを理解しやすくなります

そうです、そうです、短い関数も重要です。なぜなら、短い関数はそれほど短くなく、一目で完全に理解するのが簡単ではないコードから呼び出すことができるからです

とはいえ、あなたのサンプル関数は const の正しさを示していません

したがって、これは文字通りの質問に答えますが、おそらく const の正確性とは何かを誤解しており、他の質問をするつもりだったので、推測は控えます

于 2012-06-13T21:14:01.147 に答える