std::string vs char[] vs char*

std::string vs char[] vs char*

本文关键字:char vs string std      更新时间:2023-10-16

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

Bjarne Stroustrup,C++的创建者,在他的书中向推荐

首选字符串而非C样式字符串(字符*)

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

但是这么多开销真的是吗?这似乎与游戏开发更相关,所以这是否意味着字符串需要更多的资源,并且可能会影响帧速率?

真的有那么多开销吗?

没有。在大多数情况下,没有。使用C++11的移动语义,案例数量(过去是开销)已经大大减少。在大多数情况下,的人仍然更喜欢char*,因为他们的无知。在某些情况下,非常非常罕见的,他们选择char*而不是std::string可能是正确的。我不计算需要调用C API的情况,尽管在许多情况下,您仍然可以将std::string与C API一起使用,如果API使用const char*,只需使用c_str()即可。

有时std::string可能不合适,但这并不意味着char*是下一个选择。不,不是,因为std::vector<char>仍然可以是您的选择。所以,在选择char*之前,C++中有很多选择。

请注意,如果C++委员会接受以下针对C++1y的建议(可能是C++14),则案例数量(已经很罕见)将进一步减少:

  • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3334.html

默认情况下使用std::string,但在需要性能的地方使用char*。可以在最里面的循环中给出几个加速因素。

事实上,Bjarne在C++编程语言的第三版中也写道

istream&getline(char*s,streamsize n);

可以用于在接口之前优先考虑速度。即is比快

istream&getline(istream&is,字符串&str,字符delim);

我认为问题不在于std::string和char*,我想说的是:

事实上,我们应该关心堆分配的char*或关键路径中std::string内的char*。换句话说,我们应该避免动态内存分配,std:string或char*不是问题,如果在代码中频繁进行堆分配,它们可能都足够慢。