-1

「通常の」C++文字列と符号なし文字列の違いについて質問があります。charsとsの疑似ランダム文字列を生成unsigned charするとき、コードが通常の文字列を作成する必要がある時間とsで構成される文字列との間に大きなパフォーマンスの違いがあることに気付きましたunsigned char

私が使用したコード:

#include <tr1/random>
#include <string>


using namespace std;
using namespace tr1;

typedef basic_string<unsigned char > ustring;

string generateString(){
    string retStr;
    char a;

    for(unsigned int i = 0; i < 1000; i++){             
        a = rand();
        retStr+=a;            
    }
    return retStr;
}

ustring generateUString(){
    ustring retStr;
    unsigned char a;

    for(unsigned int i = 0; i < 1000; i++){
        a = rand();
        retStr+=a;
    }
    return retStr;
}


int main(int argc, char* args[]){

    srand(0);

    string thing;
    ustring uthing;

    for(unsigned int i = 1; i< 100000; i++){ 
        //thing = generateString(); // this needs 2 second to execute
        uthing = generateUString(); //  and this 13

    }

    return 0;
}

したがって、基本的に、コードは10万回実行するのに2秒かかりますが、generateString()10万回実行するには13秒かかりgenerateUString()ます。

これの正確な理由は何ですか?+=対応する線を切ると違いが溶けてしまったので、演算子だと思います(実際、generateUstring()その方が速いようですが、その場合はモジュロ演算が簡単だからです)。

しかし、なぜsのunsigned char文字列にaを追加するよりも、文字列にcharを追加する方がはるかに速いのでしょうか。unsigned charしたがって、sの文字列を避ける必要がありunsigned charますか?

4

1 に答える 1

2

その理由はおそらく、(デフォルトで)でコンパイルされるbasic_string<char>明示的にインスタンス化されているためです。したがって、最適化を使用してプログラムをコンパイルしない場合、操作は最適 化されませんが、インライン化されていないすべての操作は、の最適化されたコードを使用します。libstdc++.so-O2basic_string<unsigned char>basic_string<char>libstdc++.so

于 2012-07-21T21:36:10.837 に答える