2017-06-21 1 views
1

secondと呼ばれる大きなベクターがあり、大きなベクターを指すように私自身のベクターfirstが欲しいとしましょう。私はこのコードを書いた:C++での参照によって変更するこの操作のオーバーヘッドは何ですか?

#include <iostream> 
#include <vector> 

std::vector<int> second (100000,100); 
void modify(std::vector<int>& i) { 
    i = second; 
} 
int main() 
{ 
    std::vector<int> first(1, 1); 
    modify(first);  
    return 0; 
} 

はそれがmodify機能のためのオーバーヘッドがあることは本当ですか? secondの内容は新しい配列に複製され、firstに渡されるか、無視されるオーバーヘッドで参照渡しされるだけですか?

+0

ここには参照はなく、ポインタのみです。しかし、もっと重要なのは、 'modify'関数は実際には何も役に立ちません。 –

+0

@OliverCharlesworth申し訳ありません、ちょうど今すぐスニペットを修正しました –

+0

@FrançoisAndrieux申し訳ありません、今すぐスニペットを修正しました –

答えて

3

refに述べたようにはい、この意志コピー全体ベクトル、および複雑さは、secondのサイズに線形です。

リファレンスを関数パラメータとして渡すことで回避したのは、をパラメータiにコピーすることでした。あなたの関数は、この(価値機能の意味を変更するだろうことにより、ベクトルを渡す)した場合は、他の言葉では、:

// more expensive! 
void modify(std::vector<int> i) { 
    i = second; 
} 

あなたはifirstをコピーするコストに加え、コピーの費用を支払うことになりますsecond~i。もちろん、あなたのコードでは、これは違いがないでしょう。iは小さいですが、一般的には不要なコピーを避けるために大きなオブジェクトを参照渡しするのが良い方法です。


ヒント:移動のセマンティクスを検討してください。

+0

実際にはかなり安いかもしれません。何も役に立たないので、コンパイラは呼び出しを最適化することができるかもしれません。 – user4581301

+0

最適化フラグが有効な場合はうん! – gsamaras

+0

値でベクトルを受け入れると、関数の意味が変わります。 – SergeyA

関連する問題