std::string vs char[] vs char*
std::string vs char[] vs char*
我知道这个问题以前被问过,但每个人似乎对此都有不同的看法。在阅读了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*不是问题,如果在代码中频繁进行堆分配,它们可能都足够慢。
- char* 缓冲区 = C++ 中的新 vs char 缓冲区 []
- char array[sizeof(Message)]; vs char* array = new char[sizeo
- 'type_alias<char[N]>{}' VS 'char[N]{}' in function's arguments
- C++ SFINAE : is_constructible for const char[] vs std::strin
- 改变vs中持续char*的元素
- CORBA IDL to C++ - char vs. unsigned char?
- const char * ptr vs char ptr []
- Null指针异常(int Vs char)
- C++ map<std::string> vs map<char *> 性能(我知道,"again?" )
- C 字符串的长度:std::strlen() vs. std::<char>char_traits::length()
- C++ map::find char * vs. char []
- std::string vs char[] vs char*
- constexpr const char * vs constexpr const char[]
- 内存的字节读取:"signed char *" vs "unsigned char *"
- reinterpret_cast<int*>(char*) vs. static_cast<int*>(static_cast<void*>(char*)) --
- static_cast void* char* vs static_cast void** char**
- 为什么在这个上下文中打印-1 ?(有符号char vs无符号char)
- Bit shifting `char` vs. `unsigned char`
- OpenCV - char vs. int
- const constexpr char* vs. constexpr char*