- ベストアンサー
参照渡しの速度について
内部の質問なのですが、 下の簡単な例を見てください。 #include <iostream> using namespace std; //構造体 struct data { int a,b,c; }; //グローバル変数 data data1; //関数 void set_data( data &dt ) { data1 = dt;//この部分について質問 } data get_data( void ) { return data1; } int main( void ) { data d1; d1.a = 1; d1.b = 2; d1.c = 3; set_data( d ); data d2 = get_data(); cout << d2.a << d2.b << d2c << endl; return 0; } ほんとに今適当に作った変なプログラムですが無いよりはましだと思い 書いときました。 //この部分について質問 のところなのですが、これはアドレスを渡しているのでしょうか? 普通の値渡しは 内部で data1.a = dt.a; data1.b = dt.b; data1.c = dt.c; が行われていると聞いた事があるのですが、 今回の場合もそうなのでしょうか? それともアドレス渡しのように アドレスを一つ渡すだけで早い処理が出来るのでしょうか? どなたか詳しい方お願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
void set_data( data &dt ) { data1 = dt; // [2] } int main( void ) { data d1; ... set_data( d ); // [1] ... } 参照渡しなので[1]ではコピーされないので高速ですが、 [2]ではコピーが発生しています。
その他の回答 (4)
- tsukasa-12r
- ベストアンサー率65% (358/549)
インライン展開されても data = d1; でコピーが発生するのだったら、構造体の内容によっては参照渡し(あるいはポインタ渡し)の方が速いと思います・・・。 (もちろん、インライン展開の方が速い場合もあると思います。)
お礼
そ、そうなんですか? 前の人に完璧なお礼を書いてしまいました。 w やはり、アドレス渡しの方がより大きな構造体の場合は 圧倒的に早いのですよね。 ご回答ありがとうございます。
- jacta
- ベストアンサー率26% (845/3158)
ちょっと説明が足りませんでしたね。 インラインでない場合には、普通、ポインタ渡しと同じように何らかの形でアドレスを関数に渡してあげる必要がありますが、インライン展開された場合にはアドレスを渡す必要は必ずしもなくなります。結果として、 set_data( d ); の部分は、 data = d1; になってもおかしくないということです。 この場合、 > これはアドレスを渡しているのでしょうか? については、「いいえ」となります。 つまり、実引数d1(dになっていますがd1の間違いですね)をコピー渡しするよりも、&d1の値(アドレス)を渡してから関数内部で間接参照するよりも、高速になるのが普通です。
お礼
二度の回答ありがとうございます。 記述の間違いの指摘すみませんでした。 そのまま書き込んでいたのでちょっとミスです。 >つまり、実引数d1(dになっていますがd1の間違いですね)をコピー渡しするよりも、&d1の値(アドレス)を渡して>から関数内部で間接参照するよりも、高速になるのが普通です。 この辺がなんか日本語的に・・・変なのだけど インラインの場合はアドレス渡しよりも高速になる。 でいいんですよね。 知りませんでした。感謝します。 ですが、少し大きなプログラムを組んでいるので、 インラインは使わないのですが、今後使えると思います。 ありがとうございます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
ANo.2> set_data関数にしても、最適化しだいではインライン展開される場合があります。 dataがコピーされるか否かによる速度差が質問の主旨であり、関数がinlineになるかは無関係です。
お礼
ご回答ありがとうございます。 なるほど~、勉強になります。
- jacta
- ベストアンサー率26% (845/3158)
処理系(とコンパイルオプション)を特定しない限り、正確なことは何もわかりません。 set_data関数にしても、最適化しだいではインライン展開される場合があります。
お礼
ご回答ありがとうございました。 趣旨が変わっていますが、勉強になります。
お礼
ご回答ありがとうございます。 やっぱりコピーになってしまいますか~。 なんかここに質問を書いている最中になんとなく気づき始めていたのですが・・・やっぱり。 (心境)プログラム書き直さなきゃなー orz