【问题标题】:Is std::string inferior to QString?std::string 是否不如 QString?
【发布时间】:2015-02-16 22:03:32
【问题描述】:

我的一位同事声称std::string 的实现,尤其是内存管理不如Qt 库中的QStringstd::string 的哪些方面也可以参考?

【问题讨论】:

  • 你的朋友错了。 QString 是 UTF16,每个字符使用 2 个字节。 std::string 是每个字符一个字节,通常用于 utf8;虽然它不是自动 utf8。它在记忆方面更有效。 QString 对于大多数函数是可重入的,据我所知,它不像 C++11 中那样使用“移动”。
  • std:string 不是一个单一的实现。有(可能不再有)std:string 实现使用写时复制,如 QString。
  • 这样的说法毫无意义。 QString 是 Qt(具体库)的一部分,std::string 是库的特定规范的一部分。您只能评估该规范的特定实现。 QString的公共接口,在内存管理方面,与std::string的区别不大;所以,std::string可以至少和QString一样被实现。
  • @adrianm std::string 自 C++11 起不再允许使用 COW,因此此类实现正在消亡。
  • @Martin,实际上,正如其他人所说(我在写评论时忘记了),QString 使用写时复制方法(COW)。 C++98 允许 COW,并且有使用它的实现。 C++11 不再允许 COW,因此,如果您只考虑符合 C++11 的实现,那么这个问题就很有意义。

标签: c++ qt stdstring qstring


【解决方案1】:

使用内存管理,您必须决定哪种方式更适合您的应用程序。但是与 std::string 相比,QString 明显发光的一个地方是 unicode 支持。 QString 在内部存储一个 UTF-16 编码的字符串,而 std::string 是编码不可知的。当您必须处理用户提供的多字节编码字符串时,这通常会使使用 QString 而不是 std::string 变得更简单。

【讨论】:

    【解决方案2】:

    关于内存管理,QString 使用写时复制,现在在 C++ 标准库中明确禁止。但这是有原因的。写时复制习语在多线程环境中表现更差,因为它需要同步。 This article 更详细地讨论了这些问题。

    另一方面,std::string 的实现通常使用小字符串优化 (SSO) 来避免为小字符串分配任何动态内存。这就是字符串的当前状态。

    【讨论】:

    • uses copy-on-write, which is now explicitly forbidden AFAIU std::string 禁止写入时复制。