将 const std::string & 作为参数传递的日子结束了吗?

2024-02-29

我最近听到赫伯·萨特 (Herb Sutter) 的一次演讲,他提出通过的理由std::vector and std::string by const &大部分已经消失了。他建议现在最好编写如下所示的函数:

std::string do_something ( std::string inval )
{
   std::string return_val;
   // ... do stuff ...
   return return_val;
}

据我了解,return_val在函数返回时将是一个右值,因此可以使用移动语义返回,这是非常便宜的。然而,inval仍然比引用的大小(通常作为指针实现)大得多。这是因为一个std::string有各种组件,包括指向堆的指针和成员char[]用于短字符串优化。所以在我看来,通过引用传递仍然是一个好主意。

谁能解释一下为什么赫伯会这么说?


赫伯之所以说出这样的话,就是因为这样的案例。

假设我有功能A它调用函数B,它调用函数C. And A传递一个字符串B并进入C. A不知道或不关心C; all A知道的是B。那是,C是一个实现细节B.

假设 A 定义如下:

void A()
{
  B("value");
}

如果 B 和 C 将字符串取为const&,那么它看起来像这样:

void B(const std::string &str)
{
  C(str);
}

void C(const std::string &str)
{
  //Do something with `str`. Does not store it.
}

一切都很好。你只是传递指针,没有复制,没有移动,每个人都很高兴。C需要一个const&因为它不存储字符串。它只是使用它。

现在,我想做一个简单的改变:C需要将字符串存储在某处。

void C(const std::string &str)
{
  //Do something with `str`.
  m_str = str;
}

你好,复制构造函数和潜在的内存分配(忽略短字符串优化 (SSO) https://stackoverflow.com/questions/10315041/meaning-of-acronym-sso-in-the-context-of-stdstring)。 C++11 的移动语义应该能够删除不必要的复制构造,对吧?和A通过临时;没有理由C应该必须copy数据。它应该带着给予它的东西潜逃。

除非它不能。因为它需要一个const&.

如果我改变C按值获取其参数,这只会导致B复制到该参数中;我一无所获。

所以如果我刚刚过去str通过所有函数的值,依赖于std::move打乱数据,我们就不会有这个问题。如果有人想坚持下去,他们就可以。如果他们不这样做,哦,好吧。

是不是比较贵?是的;转移到一个值比使用引用更昂贵。是不是比正版便宜?不适用于具有 SSO 的小字符串。值得做吗?

这取决于您的用例。您有多讨厌内存分配?

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

将 const std::string & 作为参数传递的日子结束了吗? 的相关文章

  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • 在 C++ 中将成对向量转换为两个独立向量的最快方法

    假设我有一个vector of pair
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • 发送聊天消息

    我有这个代码 var msg new ChatMessage msg Body Test msg Recipients Add number var cms await ChatMessageManager RequestStoreAsyn
  • 使用基类作为 WCF 服务的参数

    我有一个多项目解决方案 一个项目提供一个包含多个类的 DLL 其中一门课是WorkerTemplate 另外两个类继承自它 即ExecSQLWorker and CopyWorker class ExecSQLWorker WorkerTe
  • 无服务器:在 ubuntu 16.04 中找不到命令

    我正在尝试在 Ubuntu 16 04 LTS 中设置 AWS Serverless 框架 我安装了 Node js 并且还使用以下命令安装了 Serverless npm install g serverless在终端中 但当我尝试跑步时
  • PowerShell ForEach / 管道混乱

    我正在 PowerShell 中使用 TFS PowerTools Cmdlet 尝试从我的服务器获取有关变更集和相关工作项的一些信息 我已将问题归结为我不理解的行为 我希望它不是 TFS 特定的 所以那里的人可能能够向我解释问题 这是我可
  • C# 中的内部类

    直到最近我才知道普通类和内部类 子类之间有区别 内部类的实例与其包含类的实例之间有什么关系 内部类的目的是什么以及它们有何不同 与 Java 不同 C 包含的类是嵌套的 包含类实例和被包含类实例之间没有关系 包含类仅在 C 中用于控制包含类
  • 使用 Jackson 根据 API 版本指定不同的 JSON 属性名称

    我需要能够使用 Jackson 序列化 反序列化对象同时支持多个 API 版本 我探索过以下解决方案 JsonProperty 属性命名策略 混合注解 然而 每一个都会导致自己的问题 如果我可以直接在注释中添加具有正确名称的多个版本 Jso
  • 编译/链接过程如何进行?

    编译和链接过程如何进行 Note This is meant to be an entry to Stack Overflow s C FAQ https stackoverflow com questions tagged c faq I
  • JCombobox箭头消失

    当在未放置在构造函数中的方法中填充组合框时 组合框的箭头消失 我尝试使用invokeLater方法 但它不起作用 private void fillProduct this VALID FOR PRODUCT removeAllItems
  • 内联块元素似乎毫无理由地断行?

    我有一些非常基本的 HTML CSS 但没有按我的预期工作 基本上我的身体设置为 400 像素宽 然后 我在 body 内有两个 div 其显式宽度分别为 300px 和 100px 此外 这两个 div 都设置为display inlin
  • 如何用SDL 2.0画正方形?

    我想做一些简单的事情 比如使用 C 和 SDL 在屏幕上画一个正方形 我复制的例子不起作用 Get window surface SDL Surface screenSurface SDL GetWindowSurface window F
  • 使用 Scikit learn 时出现 ValueError。模型的特征数量与输入的特征数量不匹配

    我正在使用 RandomForestClassifier 解决分类问题 在代码中 我将数据集拆分为训练数据和测试数据以进行预测 这是代码 from sklearn ensemble import RandomForestClassifier
  • 我们如何在sql server中选择前20%和后80%的记录

    我正在尝试选择表中前 20 的排序结果以及剩余的 后 80 结果 当我做 select top 20 percent from table 1 然后 select top 80 percent from table 1 order by d
  • R 中的 Grep 查找具有自定义“扩展”边界的单词

    我正在寻找一个正则表达式来 grep 整个单词 包括用数字或下划线分隔的单词 b将数字和下划线视为单词的一部分 而不是边界 例如 我想在 DOG MOUSE CAT DOG MOUSE CAT 中以及 DOG MOUSE9CAT 中以及表达
  • 添加 CHECK 以对多个表施加约束

    我想修改以下 DDL 以添加 CHECK 约束 以便商店的经理在同一家商店工作 并且商店提供所有产品 如果其类型为 本地 有人可以帮忙吗 CREATE TABLE employee employee number CHAR 5 NOT NU
  • 禁用表单提交按钮

    我有一个按钮 我想在提交表单时禁用该按钮 以防止用户多次提交 我曾尝试天真地使用 javascript onclick 禁用该按钮 但如果客户端验证失败 该按钮仍保持禁用状态 如何在表单成功提交时而不只是在用户单击时禁用该按钮 这是一个 A
  • 哪种方式更好地创建 vue 组件(导出默认值、defineComponent 和新 Vue)

    最近学习 Vue js 后 我对如何编写 vue 组件语法感到非常困惑 我一直在看 YouTube 教程和文章 每个人都使用不同的方法 就 vue 3 而言 我们应该使用 导出默认值以创建组件 或导出默认的defineComponent 或
  • 远程连接到 SQL Server Express 实例

    尝试连接到远程 SQL Express 实例时 我收到以下错误 A network related or instance specific error occurred while establishing a connection to
  • 如何让网页自动改变宽度?

    在HTML中 有没有办法让网页扩展到用户的显示器 比如我有一个15英寸的 但别人有一个24英寸的 该网页在他们的屏幕上很小 但适合最小尺寸 如何使页面扩展至 100 或者 95 流体宽度是通过使用百分比单位或 em 单位来实现的 这一切都是
  • iOS 语音到数字格式的文本转换

    目前我正在使用默认的 iOS 语音到文本转换 而无需为其添加任何代码 当用户说 五 时 它会显示为 五 或 5 但是 我需要将它始终转换为 5 我可以使用 SFSpeechRecognizer 或任何其他方式来实现此目的吗 这可以帮助您入门
  • 将 const std::string & 作为参数传递的日子结束了吗?

    我最近听到赫伯 萨特 Herb Sutter 的一次演讲 他提出通过的理由std vector and std string by const 大部分已经消失了 他建议现在最好编写如下所示的函数 std string do somethin