-1

我有一个关于“普通”C++ 字符串和无符号字符串之间区别的问题。在生成一些 chars 和unsigned chars 的伪随机字符串时,我注意到代码构建普通字符串所需的时间和由unsigned chars 组成的字符串之间存在巨大的性能差异。

我使用的代码:

#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 chars字符串要快得多呢?因此,我应该避免使用unsigned chars 字符串吗?

4

1 回答 1

2

原因可能basic_string<char>是显式实例化,libstdc++.so其中(默认情况下)使用-O2. 因此,如果您不使用优化编译程序,则 basic_string<unsigned char>操作将未优化,但所有basic_string<char>未内联的操作都将使用libstdc++.so.

于 2012-07-21T21:36:10.837 回答