「通常の」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
ますか?