2

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

C++ 的创造者 Bjarne Stroustrup 在他的书中推荐

优先使用字符串而不是 C 风格的字符串(一个 char*)

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

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

4

3 回答 3

6

真的有那么多开销吗?

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

有时std::string可能不适合,但这并不意味着char*是下一个选择。不,不是,因为std::vector<char>仍然可以是您的选择。所以你看,在你选择char*.

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

于 2013-08-11T11:37:42.807 回答
0

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

实际上 Bjarne 还在 The C++ Programming language 的第 3 版中写道

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

可能用于在接口之前优先考虑速度。即比:

istream& getline (istream& is, string& str, char delim);

于 2013-08-11T11:42:46.393 回答
0

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

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

于 2013-08-11T11:50:40.500 回答