在 C++ 中使用哪些字符串类?

2024-04-27

我们有一个用 C++ (MFC) 编写的多线程桌面应用程序。目前开发人员使用 CString 或 std::string,可能取决于他们的心情。所以我们想选择一个实现(可能不是这两个)。

MFC 的 CString 基于写时复制 (COW) 习惯用法,有些人会声称这在多线程环境中是不可接受的(可能参考本文 http://www.gotw.ca/publications/optimizations.htm)。我不相信这样的说法,因为原子计数器似乎相当快,而且这种开销在某种程度上可以通过减少内存重新分配来补偿。

我了解到 std::string 实现取决于编译器 - 它在 MSVC 中不是 COW,但在 gcc 中是或曾经是。据我了解,新的 C++0x 标准将通过要求非 COW 实现来解决此问题,并解决一些其他问题,例如连续缓冲区要求。所以实际上 std::string 目前看起来没有很好的定义......

一个我不喜欢 std::string 的简单例子:如果没有过多的重新分配,就无法从函数返回字符串(如果按值返回,则复制构造函数,并且无法访问内部缓冲区来优化它,因此“返回通过引用”例如std::string& Result没有帮助)。我可以使用 CString 通过按值返回(由于 COW 而无需复制)或按引用传递并直接访问缓冲区来完成此操作。同样,C++0x 以其右值引用来救援,但我们不会在最近的功能中使用 C++0x。

我们应该使用哪个字符串类? COW 真的会成为一个问题吗?还有其他常用的字符串高效实现吗?谢谢。

编辑:我们目前不使用 unicode,而且我们不太可能需要它。然而,如果有一些东西可以轻松支持 unicode(而不是以 ICU 为代价......),那将是一个优势。


我会用std::string.

  • 促进与MFC解耦
  • 与现有 C++ 库更好的交互

“按价值回报”问题基本上不是问题。编译器非常擅长执行返回值优化(RVO) 实际上在大多数情况下按值返回时消除了副本。如果没有,您通常可以调整该功能。

COW已被拒绝,原因是:它无法扩展(很好)并且所希望的速度增加尚未真正测量(参见 Herb Sutter 的article http://www.gotw.ca/publications/optimizations.htm)。原子操作并不像看上去那么便宜。对于单处理器单核来说这很容易,但现在多核已成为商品,并且多处理器已广泛使用(用于服务器)。在这种分布式架构中,存在多个需要同步的缓存,并且架构越分布式,原子操作的成本就越高。

Does CString实施小字符串优化?这是一个简单的技巧,允许字符串不为小字符串(通常是几个字符)分配任何内存。非常有用,因为事实证明大多数字符串实际上都很小,您的应用程序中有多少字符串长度小于 8 个字符?

所以,除非你向我提供一个真正的基准,清楚地显示使用时的净收益CString,我更愿意坚持标准:它是标准的,并且可能得到更好的优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中使用哪些字符串类? 的相关文章

随机推荐

  • 服务器发送的事件在脚本完成之前不会更新

    我有一个更新数据库的小脚本 目前处理时间大约需要一分钟左右 但是随着数据库的增加 时间也会增加 我想在脚本运行时向用户提供更新 以便他们知道脚本的状态并且它仍在运行 我实现了服务器端事件 虽然它有效 但在脚本完全完成之前 不会将任何更新发布
  • 如何使 TextBlock 可选择,以便用户可以复制其文本[重复]

    这个问题在这里已经有答案了 可能的重复 有什么方法可以使 WPF 文本块可选择吗 https stackoverflow com questions 136435 any way to make a wpf textblock select
  • 用Java从剪贴板中提取所有图像和文本

    例如 如果我打开浏览器并复制页面的所有文本和图像 CTRL A 然后粘贴到 Microsoft Word 中 则文本和图像都会被粘贴 我正在尝试编写 Java 代码 从剪贴板内容中提取文本和所有图像 以便在程序中使用文本 图像 例如稍后在
  • android.view.InflateException:二进制 XML 文件第 6 行:膨胀类片段时出错

    应用程序启动时出现此错误 我收到主题中显示的许多此类错误 这些错误似乎是偶然的 我无法重现它们 从堆栈中我可以了解到 我的不同布局资源可能会发生此类错误 XML 的行也各不相同 谁能解释为什么会出现这个错误 我能做些什么来解决这个问题 09
  • 如何使用 snapshotChanges() 方法获取键值并过滤数据?

    我正在开发一个 Angular Firebase 项目 我需要过滤数据库并获取键值 目前我正在使用值更改 我的服务代码中的方法 getUnreadBooks 和 getFavouriteBooks 方法内部 如下所示 来获取数据并对其进行过
  • 如何在 AS3 中设置 swf 的宽度和高度?

    如何在 AS3 中设置 swf 的宽度和高度 到目前为止 这是我的代码 package import flash display Sprite public class Game extends Sprite 现在 加载时它处于任意默认大小
  • 通过sparklyr将cassandra表导入spark - 可以仅选择某些列吗?

    我一直在与sparklyr要将大型 cassandra 表带入 Spark 请使用 R 注册它们并执行dplyr对他们进行操作 我已经成功导入 cassandra 表 代码如下 import cassandra table into spa
  • Heroku 负载均衡器与 Netflix zuul

    根据这个答案https stackoverflow com a 41811770 2849613 https stackoverflow com a 41811770 2849613我想获得更多有关 Heroku 上微服务最佳实践的信息 问
  • 使用图像而不是平铺填充纹理画笔

    我有一个纹理画笔 它使用特定的图像来使纹理显示如下 Image image new Bitmap Untitled png for int i 0 i lt points Count i using TextureBrush tbr new
  • 如何在 Nuxt.js 中设置 beforeResolve 导航防护

    有没有办法在 nuxt config js 中添加 beforeResolve 导航防护 我的 nuxt config js module exports router beforeResolve to from next if this
  • 当我使用 utf-8 编码时,为什么这个 Python 程序会发送空电子邮件? [复制]

    这个问题在这里已经有答案了 在对 msg 变量进行编码之前 我收到此错误 UnicodeEncodeError ascii 编解码器无法对字符 xfc 进行编码 位置 4 序号不在范围内 128 所以我做了一些研究 最后对变量进行了编码 m
  • C++ 条件运算符性能

    我有一个条件语句expensive foo 99 9 的情况下这是错误的 我有一个条件语句bar这在大约 50 的情况下是正确的 如果这两种说法都是正确的 我希望采取一些行动 所以我几乎肯定知道expensive foo 是假的 我只想在以
  • 如何传递对象的数组列表来填充每个部分标题文本及其内容?

    我在用粘性网格标题 https github com TonicArtos StickyGridHeaders对于带有部分的 GridView 这个库正在使用R array countries填充GridView使用提供的数据并从传递的字符
  • 使用 MVCContrib TestHelper 时出错

    在尝试实施第二个答案时上一个问题 https stackoverflow com questions 2887121 why does this asp net mvc unit test fail 我收到错误 我已经按照帖子所示实现了这些
  • 如何解决yarn.lock中的Git冲突

    当多个 Git 分支修改使用的项目中的依赖关系时Yarn http yarnpkg com 很可能会在yarn lock文件中引入冲突 删除并重新生成yarn lock 文件不是一个好主意 因为这可能会导致多个包意外升级 快速解决此文件中的
  • React 组合组件属性类型

    我正在使用组合模式进行反应 例如 我有这个简单的组件 class Simple extends React Component render return div this props text div Simple propTypes t
  • 是否可以将 jmeter 变量包含在从 CSV 获取的值中?

    我有一个 csv 文件 其中包含名为 query 的列 我要查询的全部内容之一是 user id list list 我想要做的是让 jMeter 在将查询传递到 HTTP Sampler 时覆盖查询中的 list 和 id 变量 其中变量
  • gcov 内存不足/版本不匹配?

    只是尝试让 gcov 启动并运行 出现以下错误 gcov src main c o build build main gcno version 404 prefer 407 gcov out of memory allocating 148
  • Visual Studio 2010 中的多行监视窗口?

    调试 XML 时 不断单击监视窗口中的文本 XML 可视化工具来查看 XML 字符串变量的完整值是一件很痛苦的事情 Visual Studio 中的 观看 窗口似乎仅限于一行 有没有办法在调试时不断 观察 多行变量的值 我想不一定要在监视窗
  • 在 C++ 中使用哪些字符串类?

    我们有一个用 C MFC 编写的多线程桌面应用程序 目前开发人员使用 CString 或 std string 可能取决于他们的心情 所以我们想选择一个实现 可能不是这两个 MFC 的 CString 基于写时复制 COW 习惯用法 有些人