ページ 11

C言語の「参照」に関する理解

Posted: 2013年10月19日(土) 17:00
by 鈴木
C言語の「参照」って
実行能率はポインタ変数よりいいと理解して大丈夫でしょうか。

例えば 下記のような関数
foo1(int* x)
{
int y = *x;
}


foo2(int& x)
{
int y=x;
}

foo1の場合、 x (アドレス) をstackに保存する作業が必要ですが、
foo2はコンパイル段階で、引き数のxをすでに真引数の名前に置き換えられたので、
int y=x だけ実行すれば良いので、早い(ただし、この時のxは真引数そのものになっている)。

正しいかどうか 
ご教授お願いします。

Re: C言語の「参照」に関する理解

Posted: 2013年10月19日(土) 17:38
by softya(ソフト屋)
C言語に参照はありませんよ。参照はC++の文法です。
なお、C++としても機械語としてfoo1とfoo2は変わらないので速度差が有るか疑問です。
関数としてはfoo2は不特定の引数を受け取る可能性が有るので特定の変数で固定化したコードを機械語として吐き出すことは出来ません。つまりfoo1と同等なのです。

Re: C言語の「参照」に関する理解

Posted: 2013年10月19日(土) 18:53
by h2so5
鈴木 さんが書きました: foo2はコンパイル段階で、引き数のxをすでに真引数の名前に置き換えられたので、
int y=x だけ実行すれば良いので、早い(ただし、この時のxは真引数そのものになっている)。
これはインライン化を行ったときの話ではないでしょうか。参照とは関係がありません。

なお一般的にポインタのよりも機能が限定されている参照を使ったほうが、コンパイラにとっては最適化が行い易いと思われます。
具体的に最適化が行われるかどうかはコンパイラによるので分かりません。

Re: C言語の「参照」に関する理解

Posted: 2013年10月21日(月) 14:53
by 鈴木
皆さまからのお返事をお伺いますと、
「参照」の存在意味が分からなくなりましたね、
「参照」という概念(またはやりかた)はなんの「メリット」もないではと、
教科書を調べたら 「->」 (アロー)を使わなくて済むと言われますが、
その代わりに 「.」でメンバーを指定するのじゃ!
「->」 と 「.」の差の程度にそんなに意味があるかと可笑しく思いますが。

Re: C言語の「参照」に関する理解

Posted: 2013年10月21日(月) 15:34
by h2so5
例えば、このようなコードを書くときに参照は有用です。
ポインタでは一時オブジェクト(rvalue)を指し示すことができないからです。

コード:

#include <iostream>
#include <string>
using namespace std;

string getText() {
	return "bbb";	
}

string getText2(const string& str) {
	return "aaa" + str;	
}

int main() {
	const string& str = getText2(getText());
	cout << str << endl;
	return 0;
}

Re: C言語の「参照」に関する理解

Posted: 2013年10月21日(月) 16:53
by spaaaark・∀・
僕も一度参照の意義が分からなかったことがあったのですが、その時に、
「参照を作ると要素が空であることがなくなるため、指し示しているオブジェクトが存在するかどうかの確認をしなくてよく、
また初期化されていないポインタの値を使用することがなくなるので、参照渡しはポインタ渡しより安全な方法である。」
という話を聞いて納得した覚えがあります。

逆に言えば参照渡しではNULLを表現できないため、NULLをとることのあるオブジェクトの引数はポインタ渡しでないと
いけないことは確かなことですが、それがない限りは参照渡しを行ったほうがバグが減ると私は思います。
オフトピック
アロー演算子->を使わなくて済むという教科書の表現は、どちらかといえばオブジェクトにポインタ経由ではなく
直感的にドット演算子.でアクセスする方が分かりやすい、といった狙いがあるのかもしれません。
ポインタに理解がある方ならいいのですが、そうでない方が見ると分からなくなってしまいそうな方は確かに居る気がします。自分も結構危ういですが…。

Re: C言語の「参照」に関する理解

Posted: 2013年10月23日(水) 12:59
by 鈴木
皆さんご教授ありがとうございます!
いい勉強になりました。