std :: string vs char [] vs char *

时间:2013-08-11 11:31:44

标签: c++ string std

我知道之前曾问过这个问题,但似乎每个人对此都有不同的看法。在阅读SO帖子之后,它仍然非常令人困惑。

C ++的创建者Bjarne Stroustrup在他的书中建议

  

优先于C风格的字符串(char *)

尽管std::string更直观,更实用,但现在许多程序员仍使用char数组和C样式字符串。他们说他们不需要std::string拥有的大部分功能。

但这真的 开销很大吗?这似乎在游戏开发中更具相关性,那么这是否意味着字符串需要更多的资源并且它可能会影响帧速率?

3 个答案:

答案 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 *不是问题,如果你在代码中频繁地进行堆分配,它们可以足够慢。