私は、私のいくつかの C ライブラリーに取り組んでいる私の C スキルを払いのけています。最初の実用的な実装をまとめた後、より効率的にするためにコードを調べています。現在、関数パラメーターを参照または値で渡すというトピックに取り組んでいます。
私の質問は、なぜ C で関数パラメーターを値で渡すのでしょうか? コードはきれいに見えるかもしれませんが、常に参照渡しよりも効率が悪いのではないでしょうか?
私は、私のいくつかの C ライブラリーに取り組んでいる私の C スキルを払いのけています。最初の実用的な実装をまとめた後、より効率的にするためにコードを調べています。現在、関数パラメーターを参照または値で渡すというトピックに取り組んでいます。
私の質問は、なぜ C で関数パラメーターを値で渡すのでしょうか? コードはきれいに見えるかもしれませんが、常に参照渡しよりも効率が悪いのではないでしょうか?
次の人間のためにコーディングすることほど、コンピューターのためにコーディングすることは重要ではないからです。参照を渡す場合、読者は、呼び出された関数がパラメーターの値を変更する可能性があり、呼び出す前にパラメーターをチェックまたはコピーする必要があると想定する必要があります。
関数シグネチャはコントラクトであり、コードを分割して、ある領域で何が起こっているかを理解するためにコードベース全体を頭に収める必要がないようにします。参照を渡すことで、次の人の生活を悪化させます。 、プログラマーとしてのあなたの最大の仕事は、次の人の人生をより良くすることです-次の人はおそらくあなたになるからです。
C では、すべての引数が値渡しされます。真の参照渡しとは、明示的な間接参照なしで変更の効果が見られる場合です。
void f(int c, int *p) {
c++; // in C you can't change the original paramenter passed like this
p++; // or this
}
ただし、ポインターの代わりに値を使用することが望ましい場合がよくあります。
int sum(int a, int b) {
return a + b;
}
次のようには書きません。
int sum(int *a, int *b) {
return *a + *b;
}
安全ではなく、効率が悪いからです。追加の間接性があるため、非効率的です。さらに、C では、ポインター引数は呼び出し元に、ポインターを介して値が変更されることを示唆します (特に、ポイントされた型のサイズがポインター自体以下の場合は true です)。
C での参照渡しを参照してください。参照渡しは C の誤称です。変数の代わりに変数のアドレスを渡すことを指しますが、変数へのポインターを値で渡しています。
そうは言っても、変数をポインターとして渡す場合、はい、わずかに効率的ですが、主な理由は、それが指す元の変数を変更できるようにするためです。これを実行したくない場合は、意図を明確にするために値を使用することをお勧めします。
もちろん、これはすべて、Cs のより重いデータ構造の 1 つに関しては意味がありません。配列は、好むと好まざるとにかかわらず、最初の変数へのポインターによって渡されます。
2 つの理由:
多くの場合、渡したポインターを何度も逆参照する必要があります (長い for ループを考えてください)。そのアドレスの値を検索するたびに逆参照する必要はありません。直接アクセスの方が高速です。
関数内で渡された値を変更したいが、呼び出し元では変更したくない場合があります。例:
void foo( int count ){
while (count>0){
printf("%d\n",count);
count--;
}
}
参照によって渡されたもので上記を実行したい場合は、関数内にさらに別の変数を作成して最初に格納する必要があります。