从 char* 初始化 std::string 而不复制

2024-04-15

我遇到一种情况,我需要处理大量(许多 GB)数据,如下所示:

  1. 通过附加许多较小的 (C char*) 字符串来构建一个大字符串
  2. 修剪绳子
  3. 将字符串转换为 C++ const std::string 进行处理(只读)
  4. repeat

每次迭代中的数据都是独立的。

我的问题是,我想最小化(如果可能的话消除)堆分配内存的使用,因为它目前是我最大的性能问题。

有没有办法将 C 字符串 (char*) 转换为 stl C++ 字符串 (std::string),而不需要 std::string 在内部分配/复制数据?

或者,我可以使用字符串流或类似的东西来重新使用大缓冲区吗?

Edit:感谢您的回答,为了清楚起见,我认为修改后的问题是:

如何有效地构建(通过多个附加)一个 stl C++ 字符串。如果在循环中执行此操作,其中每个循环完全独立,我如何重新使用此分配的空间。


如果不复制数据,您实际上无法形成 std​​::string 。字符串流可能会在传递过程中重用内存(尽管我认为标准没有明确是否确实需要这样做),但它仍然无法避免复制。

解决此类问题的常见方法是编写处理步骤 3 中的数据的代码以使用开始/结束迭代器对;那么它可以轻松地处理 std::string、字符向量、一对原始指针等。与向其传递像 std::string 这样的容器类型不同,它不再知道或关心内存是如何分配的,因为它仍然属于调用者。将这个想法推导出其逻辑结论是提升::范围 http://www.boost.org/doc/libs/1_37_0/libs/range/index.html,它添加了所有重载的构造函数,仍然让调用者只需传递带有 .begin() 和 .end() 的字符串/向量/列表/任何类型的容器,或单独的迭代器。

编写处理代码以在任意迭代器范围上工作后,您甚至可以编写一个自定义迭代器(不像听起来那么难,基本上只是一个具有一些标准 typedef 的对象,以及运算符 ++/*/=/==/ != 重载以获得一个只向前的迭代器),每次它到达正在处理的片段的末尾时,它都会处理前进到下一个片段,跳过空白(我认为这就是您所说的修剪的意思)。你根本不需要连续地组装整个字符串。这是否会获胜取决于您拥有多少碎片/有多大的碎片。这本质上就是 Martin York 提到的 SGI 绳索:一个字符串,其中追加形成片段的链接列表而不是连续的缓冲区,因此适合更长的值。


UPDATE(因为我仍然偶尔看到这个答案的赞成票):

C++17引入了另一种选择:std::string_view http://en.cppreference.com/w/cpp/string/basic_string_view,它取代了许多函数签名中的 std::string ,是对字符数据的非拥有引用。它可以从 std::string 隐式转换,但也可以从其他地方拥有的连续数据显式构造,从而避免不必要的 std::string 复制。

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

从 char* 初始化 std::string 而不复制 的相关文章

随机推荐

  • 如何将对象注入到 WCF 验证器类中

    跟进使用依赖注入世界碳基金服务 https stackoverflow com questions 881705 how to inject an object into a wcf service 有没有办法将 DI 用于 WCF验证者
  • 点击时展开 UICollectionView 及其单元格

    我正在尝试制作一个过渡动画 如链接中的演示here https dribbble com shots 2733571 Citadela countries 因此 当我单击该单元格时 它会展开并覆盖整个屏幕 这是我的代码 我不得不承认我对 C
  • Perl DBI fetchall_hashref

    考虑下表 mysql gt select from vCountryStatus CountryName CountryISO Code Status Symbol CurrencyName Brazil BR 55 LIVE BRL Br
  • 如何通过 django rest api 中的一个序列化器发布多个模型数据

    我有两个模型 Contact and User class Contact models Model name models CharField max length 50 blank True status models BooleanF
  • 如何将类作为 ASP.NET MVC htmlAttributes 的键值对传递?

    我想使用 Html TextBox FullName null new 在 ASP NET MVC 中为我的输入框传递 html 输入类属性class 灰色输入 但我想我可以使用 class 关键字 我怎样才能绕过这个问题 是的 您需要使用
  • 在 MacOS 上从源代码构建 gdb

    我正在尝试在 Apple M1 MacBook 上安装交叉编译的 gdb 我下载了 gdb 11 1 并执行了以下操作 tmp src gdb 11 1 configure enable targets all make sudo make
  • 在 JavaScript 正则表达式中链接多个正向前瞻

    我是学习正则表达式的新手 我遇到了这个答案 https stackoverflow com questions 14850553 javascript regex for password containing at least 8 cha
  • Python中使用递归获取列表的长度

    我正在尝试计算列表的长度 当我在cmd上运行它时 我得到 RuntimeError maximum recursion depth exceeded in comparison 我不认为我的代码有什么问题 def len recursive
  • 捕获不带 \n 的输入

    我正在终端中制作一个简单的 2d 游戏 我一直想知道如何获得标准输入而不必返回 因此 用户不必按 w n n 用于返回 而只需按 w 即可前进 scanf gets 和 getchar 无法做到这一点 但我以前见过在 Vi 等程序中做到过
  • 如何使用 Invoke-Sqlcmd 连接到 SQL Server LocalDB?

    I have sqlcmd exe来自 SQL Server 2008 和 SQL Server 2012 PS C gt Get Command sqlcmd exe Definition C Program Files Microsof
  • 使用散景滑块滑动图像

    我试图在滑块的帮助下无缝地传达大量科学数据 我从 Bokeh 开始 对 javascript 几乎一无所知 我尝试设置第一种方法来滑动两个图像 但我无法刷新图像 假设我的文件夹中有 1 png 和 2 png from bokeh io i
  • 在 Visual Studio 中编译时如何将 DLL 保存在不同的文件夹中?

    假设我有一个窗口表格 控制台应用程序 C 与一些项目外部参考以及对同一解决方案中其他类库项目的引用 当我构建窗口形式项目 我希望引用的库存储在不同的位置 eg bin 发布 库 并且与 exe 不在同一文件夹中 可以做吗 您的问题有两部分
  • python 3 替代 dircache?

    在我重新发明轮子之前 谁能告诉我是否有单行语句的直接 或半直接 替代 allfiles dircache listdir 一条线 不 但你可以这样做 global cache def cached listdir path res glob
  • PHP 扰乱了 HTML 设计并在 HTML 之外显示结果

    我不确定为什么会发生这种情况 我在 HTML 或其他任何方面都不是 那么好 我主要假设我的问题是如何显示结果 任何提示 帮助 或建议都非常感谢 该脚本基本上是一个简单的 FoodManagement 类 它管理食物 哈哈 这是代码 inde
  • 未定义变量 - Switch 语句在 PHP 中是否具有作用域

    大家好 这是我第一次发帖 认为这会很好 因为我完全陷入困境 据我了解 PHP 中的 switch 和 If else 语句没有变量范围 我的问题是我有一个 CSV 文件 示例文件 其中包含大约 5 行值 我需要将其放入 mySQL DB 表
  • 从文件中动态读取资源

    我一直使用 resx 文件作为静态字符串 以便有一个中心位置来更改它们 问题是在项目构建和部署后我无法更改它们 我想在部署后更改一些字符串 而不重新启动进程 因此 config 文件已退出 可以编写有效解析配置文件 XML JSON YAM
  • 什么可能导致 PUSHD 失败?

    我有一个很棒的大脚本 完全依赖于 PUSHD 然而当我打字时突然pushd server1 dir1我越来越 C Documents and Settings userNameHere gt pushd server1 dir1 CMD d
  • 如何在底部屏幕上实现可滚动选项卡

    Newsvoice 在屏幕底部的底部栏顶部有一个可滚动的选项卡 我怎样才能实现这个用户界面 谢谢 这是一些使用的示例代码Column定位可滚动的TabBar and a BottomNavigationBar in the bottomNa
  • SetInterval 是否在单独的线程上运行?该方法如何运作?

    我环顾四周试图了解如何SetInterval但只找到了如何使用它 我已经知道它的功能 我只是好奇当 JS 不支持线程时它如何能够在单独的线程上运行某些东西 至少这是我读到的 我希望我正确地提出了这个问题 Thanks setInterval
  • 从 char* 初始化 std::string 而不复制

    我遇到一种情况 我需要处理大量 许多 GB 数据 如下所示 通过附加许多较小的 C char 字符串来构建一个大字符串 修剪绳子 将字符串转换为 C const std string 进行处理 只读 repeat 每次迭代中的数据都是独立的