• 締切済み

値渡しと参照渡しについて

テンプレートについて調べているときに以下のような使用例がありました。 例)template<class T> T max(const T& a, const T& b) { return ( a > b ) ? ( a ) : ( b ); } これの説明に、「引数を参照にすることで、インスタンスを渡した場合の処理時間の短縮になる」と書かれていたのですが、どうして処理時間が短縮されるのでしょうか? また、実際に目で見える形で証明する方法はありますでしょうか。 ちなみに自分はC++についてはまだ初心者です。 どうか皆様のアドバイスをよろしくお願い致します。

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

整数型の変数であれば差はないですが 例えば1000バイトのオブジェクトを引数で渡す場合、値渡しだと1000バイト全部コピーして渡すので時間がかかりますが参照渡しだとポインタ分の4バイトや8バイトのコピーだけですみます。 大きなオブジェクト作って比較すれば証明できるでしょう。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

引数の受け渡し時にコピーを行わないからです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 「テンプレート」について

    C++でテンプレートについて調べています。 しかし、参考書や参考サイトを見ても下記の例のような、簡易な処理しか載っていないので、 実際にはどのような使われ方をしているのかわかりません。 例1)引数の大小を比較して、小さい方を返す。 template <class T> inline const T& btMin(const T& a, const T& b) { return b < a ? b : a; } 例2)引数の値を入れ替える処理 template <class T> inline void swap(T& a, T& b) { T temp = a; a = b; b = temp; } そこで、参考書や参考サイトなどでは載っていないような、 思いもよらない使われ方をしているものはご存じありませんか? できれば、使われているオープンソースの場所を教えて頂けると嬉しいです。 皆さんどうかよろしくお願い致します。

  • javascript 値渡し?参照?

    javascriptの値渡しについて勉強中なのですが、質問です。 ----------------------------------------------------------------- function aaa(a,b){ var ttt = a ; a = b ; b = ttt ; } var a1 = 1 ; var a2 = 2 ; aaa (a1,a2) ; document.write(a1 ,a2); ------------------------------------------------------------------- 上記のようなコードで引数の値が交換できると思うのですが、正しくは出来ないようです。 1,0と出力されてしまいます。 どうしてなのでしょうか。 お聞きしたいのは、 ・この引数は値渡しなのか、参照なのか。 ・どうして出来ないのか詳しい理由。 よろしくお願いします。

  • 関数で値渡しと参照渡しではどっちがメモリを使うのか

    クラスAの大きなサイズのオブジェクトを、 クラスBで処理するメソッドを書こうとしています。 ◆質問 このとき、クラスBでは、byval で記載するのと、byrefで記載するのでは、 どちらの方がメモリを食わないのでしょうか? ◆自分の想定 (1)byrefで記載した場合、そのオブジェクトのポインタを受け取って処理するため、あんまりメモリは食わない。 (2)byvalで記載した場合、ある意味、.clone のような処理がされて、渡されたオブジェクトと同じサイズのメモリを食う? ※処理しようとしていることは、特に参照渡しされた変数の値を修正するような類ではないです。 なので、「オブジェクトを不用意にいじってしまう危険性」などの観点は無視し、メモリの観点の話です。 ちなみに、メソッドを、shareで宣言しようが、インスタンス化してからじゃないと使えないように宣言しようが、その関数のために使用されるメモリのサイズ(※クラスBのインスタンス化のためのメモリではないという意味)は変わらないということで合っていますでしょうか? .

  • const参照をポインタ引数として渡すには?

    Aというクラスがあって、BはAを継承しているとします。 そこで、Bのconst参照を返却する以下の関数定義があったとします。 const B& getB() { return b; //bはB型 } さらに次の関数があります。 void C(A* a) { //適当な処理 } ここでCを以下のように呼ぼうとするとコンパイルエラーになります。 C(getB()); Cは引数として型Aを求めていますが、BはAを継承しているので、 そのまま渡しても問題ないと思います。 次に、Cは引数としてポインタを求めているのにgetBの戻り値の参照をそのまま 渡しているからまずいのだと思い、以下のようにしました。 const B& hoge = getB(); C(*hoge); //参照をポインタに変換 しかし、さらに型が違うとエラーになります。 どこがまずいのでしょうか? それと、上では参照をポインタに変換するために変数hogeを宣言していますが、 それを省略して一気にやる方法はないでしょうか? C(*getB()); のようなやり方がしたいのですが。

  • 可変引数をconstで参照渡し

    以下のようなクラスをconstの参照渡しでうけとる、可変引数を持つ関数を作りたいのですが、以下のようにしてもうまくいきません。 何か良い方法はないものでしょうか? template<class TT> class vector3{ public:  enum{NUM=3};  TT x[NUM];  void Sum(const int num,...); }; template<class TT> void vector3<TT>::Sum(const int num,const ...){  int i,j;  va_list list;  va_start(list,num);  for(i=0;i<NUM;i++){   x[i]=va_arg(list,&vector3<TT>).x[i];  }  for(j=1;j<num;j++){   for(i=0;i<NUM;i++){    x[i]+=va_arg(list,&vector3<TT>).x[i];   }  }  va_end(list); }

  • 参照渡しの間違ったコードの謎?

    現在、C++勉強中の初心者です。テキストの練習問題で値呼び出しと参照呼び出しを比較する問題に取組中に、以下のような間違ったコードを書いてしまいました。 (参照渡しのコードで、返値を設定してしまいました) ---------------------------------------- #include<iostream.h> int tripleCallByValue(int); int tripleByReference(int &); main(){ int count; cout << "count = " ; cin >> count; cout << "コピー: " << count << "\t" << tripleCallByValue(count) << endl; cout << "参照 : " << count << "\t" << tripleByReference(count) << endl; cout << "コピー: " << count << "\t" << tripleCallByValue(count) << endl; cout << "参照 : " << count << "\t" << tripleByReference(count) << endl; return 0; } int tripleCallByValue(int num){ return num *= 3; } int tripleByReference(int &num){ return num *= 3 ; } ---------------------------------------- 入力値を3倍するプログラムで、3を入力した場合の結果は   仮引数  返値 コピー  3     9 参照  9   9 コピー 9   27 参照  27   27 となりました。(Borland C++コンパイラ使用) わからないのは、2行目の参照渡しの仮引数が'9'であることです。1行目は値渡しなので、仮引数は影響を受けず、'3'が次の参照渡しの仮引数として使用されるとおもってました。 何が起こっているのか、まったく理解できません。これは、意味のある間違いでしょうか?だとしたら、どんな処理が行われた結果でしょうか? 解説よろしくお願いします。

  • qsortについて

    qsort()で構造体をソートする時に、qsortの第3,4引数時の、「size t_t size, int (*cmp)(const void *a, const void *b)」の使い方が分かりません。 何故これを使ってソートが出来るのでしょうか?そもそも、構造体を送った時に、自作関数内での書き方にも疑問があります。 int main(void){ MAX dt[5]={・・・・}; //構造体変数宣言 ・・・・・ qsort(dt,5,sizeof(MAX),sum); //(*1) .... return 0; } int sum(const void *a, const void *b){ MAX *p1 = (MAX *)a; //(*2) MAX *p2 = (MAX *)b; //(*2) ・・・・ return ~; } ---------------------------------------------------- *1: 第3引数のsizeof(MAX)って何ですか? *2: 例えばint型が渡されてreturnする場合は、「return *(int *)a - *(int *)b 」でいいのに、   何故構造体の場合はこう書かないといけないのですか?

  • templateを使ったときの未解決の外部シンボルエラー

    以下のプログラムを、Visual C++ 2008でビルドすると、 『error LNK2019: 未解決の外部シンボル "class A<double> __cdecl add(class A<double> const &,double const &)" (?add@@YA?AV?$A@N@@ABV1@ABN@Z) が関数 _main で参照されました。』 のエラーになります。 template < typename T > class A { private: T x, y; public: A( const T& xx, const T& yy ):x(xx),y(yy){} T getx() const {return x;} T gety() const {return y;} friend A<T> add( const A<T>&, const T& ); }; template < typename T > A<T> add( const A<T>& a, const T& z ){ return A(a.x+z, a.y+z); } /* 直前のテンプレートでこの関数を作ったつもりです A<double> add( const A<double>& a, const double& z){ return A<double>(a.x+z, a.y+z); } /**/ #include <iostream> int main() { A<double> a(1.0, 2.0); double z=3.0; std::cout << add(a,z).getx() << "\n"; } どう書けばよいのでしょうか。

  • C++ template operator T()

    ソースを見ていて分からないところがあったので教えて下さい。 なんと説明すればいいのか分からないので下に要約したソースを書きます。 template <typename T> class Hoge { T a_; public: Hoge(T a = 0) : a_(a) {} operator T() const { // ココが分からない return a_; } }; 最初は、関数オブジェクトかと思ったのですがそうではないですよね? operator()(引数) ですよね? 次は、Tのコンストラクタかと思ったのですが、class Hoge の中に書くのも変な気がしました。

  • template<calss T> A(const T &t=T())

    template<class T> A(const T &t=T()); という関数宣言において引数のところの解釈に戸惑ってます どういう風に解釈したらいいのか教えていただければ幸いです