C言語の「参照」って
実行能率はポインタ変数よりいいと理解して大丈夫でしょうか。
例えば 下記のような関数
foo1(int* x)
{
int y = *x;
}
foo2(int& x)
{
int y=x;
}
foo1の場合、 x (アドレス) をstackに保存する作業が必要ですが、
foo2はコンパイル段階で、引き数のxをすでに真引数の名前に置き換えられたので、
int y=x だけ実行すれば良いので、早い(ただし、この時のxは真引数そのものになっている)。
正しいかどうか
ご教授お願いします。
C言語の「参照」に関する理解
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: C言語の「参照」に関する理解
C言語に参照はありませんよ。参照はC++の文法です。
なお、C++としても機械語としてfoo1とfoo2は変わらないので速度差が有るか疑問です。
関数としてはfoo2は不特定の引数を受け取る可能性が有るので特定の変数で固定化したコードを機械語として吐き出すことは出来ません。つまりfoo1と同等なのです。
なお、C++としても機械語としてfoo1とfoo2は変わらないので速度差が有るか疑問です。
関数としてはfoo2は不特定の引数を受け取る可能性が有るので特定の変数で固定化したコードを機械語として吐き出すことは出来ません。つまりfoo1と同等なのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C言語の「参照」に関する理解
これはインライン化を行ったときの話ではないでしょうか。参照とは関係がありません。鈴木 さんが書きました: foo2はコンパイル段階で、引き数のxをすでに真引数の名前に置き換えられたので、
int y=x だけ実行すれば良いので、早い(ただし、この時のxは真引数そのものになっている)。
なお一般的にポインタのよりも機能が限定されている参照を使ったほうが、コンパイラにとっては最適化が行い易いと思われます。
具体的に最適化が行われるかどうかはコンパイラによるので分かりません。
Re: C言語の「参照」に関する理解
皆さまからのお返事をお伺いますと、
「参照」の存在意味が分からなくなりましたね、
「参照」という概念(またはやりかた)はなんの「メリット」もないではと、
教科書を調べたら 「->」 (アロー)を使わなくて済むと言われますが、
その代わりに 「.」でメンバーを指定するのじゃ!
「->」 と 「.」の差の程度にそんなに意味があるかと可笑しく思いますが。
「参照」の存在意味が分からなくなりましたね、
「参照」という概念(またはやりかた)はなんの「メリット」もないではと、
教科書を調べたら 「->」 (アロー)を使わなくて済むと言われますが、
その代わりに 「.」でメンバーを指定するのじゃ!
「->」 と 「.」の差の程度にそんなに意味があるかと可笑しく思いますが。
Re: C言語の「参照」に関する理解
例えば、このようなコードを書くときに参照は有用です。
ポインタでは一時オブジェクト(rvalue)を指し示すことができないからです。
ポインタでは一時オブジェクト(rvalue)を指し示すことができないからです。
- spaaaark・∀・
- 記事: 66
- 登録日時: 12年前
- 住所: 埼玉
- 連絡を取る:
Re: C言語の「参照」に関する理解
僕も一度参照の意義が分からなかったことがあったのですが、その時に、
「参照を作ると要素が空であることがなくなるため、指し示しているオブジェクトが存在するかどうかの確認をしなくてよく、
また初期化されていないポインタの値を使用することがなくなるので、参照渡しはポインタ渡しより安全な方法である。」
という話を聞いて納得した覚えがあります。
逆に言えば参照渡しではNULLを表現できないため、NULLをとることのあるオブジェクトの引数はポインタ渡しでないと
いけないことは確かなことですが、それがない限りは参照渡しを行ったほうがバグが減ると私は思います。
「参照を作ると要素が空であることがなくなるため、指し示しているオブジェクトが存在するかどうかの確認をしなくてよく、
また初期化されていないポインタの値を使用することがなくなるので、参照渡しはポインタ渡しより安全な方法である。」
という話を聞いて納得した覚えがあります。
逆に言えば参照渡しではNULLを表現できないため、NULLをとることのあるオブジェクトの引数はポインタ渡しでないと
いけないことは確かなことですが、それがない限りは参照渡しを行ったほうがバグが減ると私は思います。
オフトピック
アロー演算子->を使わなくて済むという教科書の表現は、どちらかといえばオブジェクトにポインタ経由ではなく
直感的にドット演算子.でアクセスする方が分かりやすい、といった狙いがあるのかもしれません。
ポインタに理解がある方ならいいのですが、そうでない方が見ると分からなくなってしまいそうな方は確かに居る気がします。自分も結構危ういですが…。
直感的にドット演算子.でアクセスする方が分かりやすい、といった狙いがあるのかもしれません。
ポインタに理解がある方ならいいのですが、そうでない方が見ると分からなくなってしまいそうな方は確かに居る気がします。自分も結構危ういですが…。
クリエイティブな生活で刺激的な毎日を!