我知道之前曾问过这个问题,但似乎每个人对此都有不同的看法。在阅读SO帖子之后,它仍然非常令人困惑。
C ++的创建者Bjarne Stroustrup在他的书中建议
优先于C风格的字符串(char *)
尽管std::string
更直观,更实用,但现在许多程序员仍使用char数组和C样式字符串。他们说他们不需要std::string
拥有的大部分功能。
但这真的 开销很大吗?这似乎在游戏开发中更具相关性,那么这是否意味着字符串需要更多的资源并且它可能会影响帧速率?
答案 0 :(得分:6)
真的那么多开销吗?
没有。在大多数情况下,没有。使用C ++ 11的移动语义,大大减少了案例数(过去曾经是开销)。在大多数情况下,由于他们的无知,仍然更喜欢char*
的人这样做。在某些非常罕见的情况中,他们可能正确选择char*
而不是std::string
。我不计算您需要调用C API的情况,但在许多情况下,您仍然可以将std::string
与C API一起使用,如果API采用c_str()
,则只需使用const char*
。< / p>
某些时候std::string
可能不合适,但这并不意味着char*
是下一个选择。不,不是,因为std::vector<char>
仍然可以作为您的选择。所以你看,在你选择char*
之前,C ++有很多选择。
请注意,如果以下提议被C ++委员会C ++ 1y(可能是C ++ 14)接受,则案例数量(已经很少)会进一步减少:
答案 1 :(得分:0)
默认情况下使用std :: string,但在需要性能的地方使用char *。可以在最里面的循环中给出几个加速的因素。
实际上Bjarne还在第3版的C ++编程语言中写道
istream的&安培; getline(char * s,streamsize n);
可能用于在界面之前优先考虑速度。即是快于:
istream的&安培; getline(istream&amp; is,string&amp; str,char delim);
答案 2 :(得分:0)
我认为问题不在于std :: string和char *,我想说的是:
实际上,我们应该关心堆栈分配的char *或关键路径中std :: string里面的char *。换句话说,我们应该避免动态内存分配,std:string或char *不是问题,如果你在代码中频繁地进行堆分配,它们可以足够慢。