使用外部缓冲区存储字符串而不进行复制

2023-12-02

假设我有一个函数可以得到const string&作为其输入,例如:

void foo(const string& s);

然后我有一个内部缓冲区const char* buffer;我知道它的大小。

我认为如果我内联创建字符串,仍然会发生一份副本:

foo(string(buffer, n));

但是不需要复制缓冲区,因为所有事情都是不变的,我只需要字符串类的功能而不是它创建的缓冲区。

我必须提到,我不确定复制是否发生,但是看看字符串的构造函数他们都说复制会发生。我不知道编译器优化是否可以理解这种情况,并且我找不到一种方法来确保复制是否发生。

有什么方法可以使用字符串的外部缓冲区,或者至少有一种方法可以确保复制是否发生。我目前正在使用 std string 和 c++11。


是的,抄袭总是在发生。顺便说一句,你不需要包装std::string(buffer)作为构造函数std::string(char const*)是隐式且简单的

foo(buffer);

会隐式地将缓冲区复制到字符串中。如果您是作者foo你可以添加一个重载

void foo(char const*)

这避免了复制。然而,C 字符串面临着 null 终止符是字符串 API 的一部分的问题,因此您无法在不改变底层字符串的情况下轻松创建子字符串(例如strtok).

库基础技术规范包含string_view将消除复制的类char const*,但保留了子集能力std::string

#include <iostream>
#include <experimental/string_view>

void foo(std::experimental::string_view v) { std::cout << v.substr(2,8) << '\n'; }

int main()
{
    char const* buffer = "war and peace";
    foo(buffer);
}

实例(在 C++14 模式下需要 libstdc++ 4.9 或更高版本)。

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

使用外部缓冲区存储字符串而不进行复制 的相关文章

  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 私有模板函数

    我有一堂课 C h class C private template
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良

随机推荐

  • 如何从代码中获取PCRE(与PHP捆绑在一起)的版本?

    有什么方法可以获取版本 和发布日期 PCRE从 PHP 代码与 PHP 捆绑并将其存储到变量中 我可以使用它找到它phpinfo 但找不到任何其他方法来直接从代码获取该值 过去几个小时我试图找到解决方案 但毫无希望 到目前为止 我可以在变量
  • 使用 C++/Boost 通过代理执行简单的 HTTP 请求?

    我是 Boost 的新手 我唯一通过使用库的代理进行冲浪的经验是使用 NET 这对于此目的来说非常方便 我现在尝试通过 HTTP 代理执行简单的 HTTP 请求 有没有直接使用 boost 的简洁方法 我的代理使用 NTLM 身份验证 不
  • 占位符在 IE10 中不起作用

    html div class div input div
  • 如何在flutter中使用带有url编码主体的http.post下载文件?

    我想构建一个网络应用程序来使用 http post 方法在 flutter 中下载 pdf 文件 我已经在互联网上搜索了它 但我仍然无法下载该文件 我已经在邮递员中尝试过使用原始 json 然后发送和下载 它可以工作 但不能在颤振中做到这一
  • ASP.NET Web API 仅在某些服务器上为 PUT 返回 404

    我已经编写了一个使用 ASP NET MVC Web API 的网站 一切都运行良好 直到我将其放在临时服务器上 该网站在我的本地计算机和开发网络服务器上运行良好 开发服务器和登台服务器都是 Windows Server 2008 R2 问
  • Caliburn.Micro:如何将 Conductor.Collection.AllActive 的特定项目绑定到 ContentControl

    我的目标是在 ShellView 的网格中显示 4 个不同的活动 ViewModel 问题是我无法弄清楚如何将 ContentControl 连接到 Conductor 项目中的特定项目 他的事怎么办 这是我正在尝试做的事情的简化版本 解决
  • 按值组的连续日期范围对行进行分组

    考虑一些表T 订购Col1 Col2 Date1 Date2 Col1 Col2 Date1 Date2 rate ABC 123 11 4 2014 11 5 2014 90 ABC 123 11 4 2014 11 6 2014 55
  • 用C++制作一个倒计时器

    我有一个控制台应用程序 旨在只在 Windows 上运行 它写在C 有什么办法可以等待60秒 and 显示剩余时间在屏幕上 然后继续代码流 我尝试了互联网上的不同解决方案 但没有一个有效 它们要么不起作用 要么无法正确显示时间 Please
  • Windows 7上Android Studio安装失败,找不到JDK

    我下载了 Android Studio 并尝试启动该程序 它在 Windows 7 64 位和 Java 1 7 上运行 在安装过程中 检测到我的 Java 1 7 安装的其余部分顺利进行 但是 当尝试从桌面图标启动应用程序时 没有任何反应
  • 使用 DotNetZip 从 zip 中提取特定文件夹

    我已经搜索了示例 但似乎找不到涉及提取某个文件夹的 DotNetZip 场景 我正在尝试从 zip 文件中提取一个名为 CSS 的文件夹 它是 zip 文件内的顶级文件夹 这是我到目前为止的代码 using ZipFile zip1 Zip
  • Swift 中如何知道哪个 SKSpriteNode 受到碰撞检测的影响?

    情况 我的 iOS 屏幕上有两艘或更多艘飞船 两者都有不同的属性 如名称 大小 生命值和得分 它们显示为SKSpriteNodes并且每个都添加了一个physicsBody 目前 这些额外的属性是扩展的变量SKSpriteNode clas
  • 在R中的时间间隔后中断readline()

    如何在经过一定时间后中断循环 我有一个从用户收集观察数据的功能 记录数据时 用户应该有一个预定义的时间限制 示例中为 30 秒 目前 如果用户输入晚于时间限制结束 该功能就会中断 record events lt function dura
  • 将 CUDA 添加到 ROS 包

    我想在 ros 包中使用 cuda 有人给我一个简单的例子吗 我尝试使用 cuda 函数构建一个静态库并将该库添加到我的包中 但总是出现链接错误 未定义的引用 cuda 我已经构建了一个可执行文件而不是库并且它可以工作 请帮忙 我自己找到了
  • 使用数组分隔符连接数组序列(“散布”)

    是否有一个函数可以让我连接多个数组 它们之间有分隔符 分隔符也是数组 类似于join有效但不限于字符串 该函数可以是标准 JS 或主要库的一部分 例如lodash 这就是标签中引用它的原因 这是一个用法示例 let numbers 1 2
  • 未捕获的类型错误:对象 [object Object] 没有方法“on”

    我创建了一个函数appendScript 它将在按钮单击事件上调用 我的函数代码是 function appendScript var v js var head document getElementsByTagName head 0 v
  • 设置UDP套接字的recv fcn超时

    我通过以下方式发送 UDP 数据包sendto 然后通过以下方式收到答案recv if recv没有收到回复 程序不会继续进行 但是 udp数据包可能会丢失 或者由于某种原因无法发送数据包 从而导致程序卡在recv线 我想知道如何设置超时r
  • Google 托管库不必要地使用缓存断路器

    我在仪表板上使用以下代码来不断刷新它而不会闪烁如何使用 jQuery 刷新页面 然而 由于一些缓存破坏器 这也会导致 javascript 每次重新加载
  • JavaScript 中的日期到时间戳

    javascript 是否可以将某些日期转换为时间戳 我有这种格式的日期2010 03 09 12 21 00我想用 javascript 将其转换为等效的时间戳 回应您的编辑 你需要解析日期字符串建立一个Date对象 然后就可以获取时间戳
  • create-react-app 中缩小的组件堆栈跟踪(开发模式)

    Running create react app in 发展 mode 为什么我的控制台错误链接到缩小的代码块 我想我记得 CRA 能够显示源映射文件 这是因为该错误是由您使用的依赖项之一引发的 当你安装一个包时 你会在你的node mod
  • 使用外部缓冲区存储字符串而不进行复制

    假设我有一个函数可以得到const string 作为其输入 例如 void foo const string s 然后我有一个内部缓冲区const char buffer 我知道它的大小 我认为如果我内联创建字符串 仍然会发生一份副本 f