我有一个关于“普通”C++ 字符串和无符号字符串之间区别的问题。在生成一些 chars 和unsigned char
s 的伪随机字符串时,我注意到代码构建普通字符串所需的时间和由unsigned char
s 组成的字符串之间存在巨大的性能差异。
我使用的代码:
#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;
}
所以基本上,代码执行 100 000 次需要 2 秒generateString()
,而执行 100 000 次需要 13 秒generateUString()
。
这究竟是什么原因?我猜是+=
操作员,因为当我切割相应的行时差异消失了(实际上,generateUstring()
我猜当时似乎更快,因为在这种情况下模算术更容易)。
unsigned char
但是,为什么将 char 附加到字符串比将 a 附加到unsigned char
s字符串要快得多呢?因此,我应该避免使用unsigned char
s 字符串吗?