2016-10-26 4 views
0

一般的に値と参照の渡し方、特に重要でない型の場合には大きな違いがあり、主にオブジェクトがコピーされているかどうか、いくつか右辺値があるときは注意が必要です。定数値と定数参照によるベクトルの受け渡し

しかし、私は、渡された引数が定数のときに、これらの2つのものが同一であると実際に認識しているかどうかを疑問に思っています。そうでない場合は、引数をほとんど参照渡しするのが標準であると仮定します。

答えて

1

一般的に、コンパイラーは、参照渡しで値渡しを置き換えることはできません。一般的に、エイリアスの問題が発生する可能性があるからです。

引数の値が、その後、いわば、constの下に変更することができます:

void foo(string const a, string& backarai) 
{ 
    backarai = "Hm! "; 
    backarai += a; 
} 

void bar(string const& a, string& backarai) 
{ 
    backarai = "Hm! "; 
    backarai += a; 
} 

auto main() -> int 
{ 
    string s = "Well well well!"; 
    foo(s, s); // Sets s to "Hm! Well well well!" 

    string t = "Well well well!"; 
    bar(t, t); // Sets t to "Hm! Hm!" 
} 

しかし、特定の場合には、コンパイラは、このようなエイリアシングが問題になることはありませんことを証明できる場合には、文字列のコピーに副作用などがないこと、つまり、両方のケースで観察可能なプログラムの振る舞いが同じになることを証明できれば、この方法で最適化することができます。それは実際に” -ruleのようにちょうど“です。観察可能な変更のみがコードの実行時間である場合、任意の最適化が可能です。

+0

私はすべての引数がこれよりも一定であると仮定します。 –

+0

はい。しかし、それはまだそれが証明する必要があります。文字列のコピーには副作用がありません。 'std :: string'はコンパイラベンダーによって提供されているので、それは可能ですが、それが完了したかどうかはわかりません。 –

+0

そうかもしれません。私の場合、私はベクトルを扱っていますが、それを知ることは何らかの方法ではありました。 –

関連する問題