2016-08-23 5 views
0
void func(char c) {} 
void func(std::string) {} 

int main() { 
    std::string s("HelloWorld"); 

    // method 1 
    func(s); 

    // method 2 
    for(std::size_t i = 0; i < s.size(); i++) { 
     func(s[i]); 
    } 
} 

2回目の呼び出しで値渡しがなぜOKですか?それは効果的に最後に同じ数の文字をコピーしていないのですか?あるいは、彼らは実際に同じで、私は何かが足りないのですか?値渡し文字列渡し値ごとにすべての文字を渡す

+1

(これは、文字列内の各文字のための関数を呼び出すことは常にOKであることを意味しません)とに問題がありますか?関数は一度に1つの文字しか処理しないか、文字列全体を処理する必要がありますか? –

+2

この2つのケースでは、関数呼び出しの数もカウントする必要があります。そして、あなたが何が最速であるか疑問に思っているなら、いくつかの測定をしてください。もちろん、参照を渡すことについて忘れないでください。 –

答えて

1

std::stringのコピーは、割り当てを行います(小さな文字列の最適化を行わない限り)。charをパラメータとして渡すのはおそらくレジスタで行います。関数に値によって、文字列のすべての文字を渡すconst参照

void func(const std::string&); 
+0

すべてのシステムがレジスタに値を渡すのに十分なレジスタを持っているわけではありません。たとえば、32ビットx86アーキテクチャのように。しかし、これは最大の問題ではない、最も大きな問題は*関数呼び出し*の数である。大きな違いがあります。 –

+0

私の問題は、少なくとも2回何か値をコピーしなければならないということでした。たとえば、char配列内のセルにcharを代入する場合は、代入演算子を使用する必要があります。この演算子は、charを値として受け取り、次にこの値を必要なセルにコピーすると仮定しています。 – mkmostafa

+0

@mkmostafaあなたの*実際の*問題は何ですか?それは "効率"または最適化の1つですか?文字をコピーするのは簡単ではなく、短い時間で何百万回も実行すれば目立つでしょう。私はあなたが[XY問題](http://xyproblem.info/)について読んで、それがあなたの質問にどのように関係しているのか考える必要があると思います。 –

1

によって

パスstd::stringは値によって文字列全体を渡すのと同じくらい、大丈夫ではないです。つまり、どちらの場合でも、可能であれば、文字列全体をコピーまたはトラバースする必要がない、いくつかの代替方法を選択する必要があります。

1

文字のサイズが参照渡しに必要なポインタのサイズより小さいため、値で1文字を渡すことはOKです。さらに、文字に対してコピーコンストラクタは呼び出されません。

実際のコードyoureの執筆の目的は何

関連する問題