返回空字符串:C++ 中的有效方法

2024-05-03

我有两种从函数返回空字符串的方法。

1)

std::string get_string()
{
   return "";
}

2)

std::string get_string()
{
   return std::string();
}

哪一种更有效,为什么?


Gcc 7.1 -O3 这些都是相同的,godbolt.org/z/a-hc1d – jterm 4 月 25 日 3:27

原答案:

做了一些挖掘。下面是一个示例程序和相关程序集:

Code:

#include <string>

std::string get_string1(){ return ""; }

std::string get_string2(){ return std::string(); }

std::string get_string3(){ return {}; }           //thanks  Kerrek SB

int main()
{
    get_string1();
    get_string2();
    get_string3();
}

集会:

__Z11get_string1v:
LFB737:
    .cfi_startproc
    pushl   %ebx
    .cfi_def_cfa_offset 8
    .cfi_offset 3, -8
    subl    $40, %esp
    .cfi_def_cfa_offset 48
    movl    48(%esp), %ebx
    leal    31(%esp), %eax
    movl    %eax, 8(%esp)
    movl    $LC0, 4(%esp)
    movl    %ebx, (%esp)
    call    __ZNSsC1EPKcRKSaIcE
    addl    $40, %esp
    .cfi_def_cfa_offset 8
    movl    %ebx, %eax
    popl    %ebx
    .cfi_restore 3
    .cfi_def_cfa_offset 4
    ret $4
    .cfi_endproc

__Z11get_string2v:
LFB738:
    .cfi_startproc
    movl    4(%esp), %eax
    movl    $__ZNSs4_Rep20_S_empty_rep_storageE+12, (%eax)
    ret $4
    .cfi_endproc

__Z11get_string3v:
LFB739:
    .cfi_startproc
    movl    4(%esp), %eax
    movl    $__ZNSs4_Rep20_S_empty_rep_storageE+12, (%eax)
    ret $4
    .cfi_endproc

这是用编译的-std=c++11 -O2.

可以看到,还有很多工作要做return "";声明和相对较少的return std::string and return {};(这两个是相同的)。

正如弗里希·拉贝(Frerich Raabe)所说,当经过一个空的C_string,它仍然需要对其进行处理,而不仅仅是分配内存。看来这不能被优化掉(至少不能被 GCC 优化)

所以答案肯定是使用:

return std::string();

or

return {};   //(c++11)

虽然除非你回来a lot性能关键代码中的空字符串(我猜是日志记录?),差异仍然是微不足道的。

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

返回空字符串:C++ 中的有效方法 的相关文章

  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 在 C# 中使用逗号和小数格式化数字

    我需要显示一个带有逗号和小数点的数字 例如 情况 1 十进制数是 432324 没有逗号或小数点 需要将其显示为 432 324 00 不 432 324 情况 2 十进制数是 2222222 22 没有逗号 需要将其显示为 2 222 2
  • 用 Chronos 取代 Celerybeat

    成熟到什么程度Chronos http airbnb github io chronos 它是像 celery beat 这样的调度程序的可行替代品吗 现在 我们的调度实现了一个定期的 心跳 任务 该任务检查 未完成的 事件 并在过期时触发
  • 无法锚定到不是父级或同级 QML QtQuick 的项目

    我正在使用 QML 开发 python 桌面应用程序 我的 QML 文件中有这个 SplitView anchors fill parent orientation Qt Horizontal Rectangle color 272822
  • 如何查找 DICOM 研究中的图像数量?

    是否可以通过读取该研究中文件的 DICOM 标头来查找 DICOM 研究中的图像数量 我正在开发一个 Java 应用程序 该应用程序接收来自不同来源的 DICOM 研究 我只是想检查是否已完全收到研究 不幸的是 我不能依赖阅读 DICOMD
  • 如何在 Node CLI 程序中使用 babel?

    我正在 Node 中编写一个小型 CLI 工具 并希望使用 ES6 来实现 index js 看起来像 usr bin env node require babel register module exports require app 我
  • 如何创建一个自定义中继器,根据属性显示页眉、页脚?

    我想创建一个根据属性显示页眉 页脚的中继器 仅当DataSource是空的 public class Repeater System Web UI WebControls Repeater public bool ShowHeaderOnE
  • 由于对象的当前状态,操作无效 - Linq on List

    对列表运行 Linq 查询时会引发此错误 我使用 Unity3D 3 0 和 C Unity3D 使用 Mono 2 6 据我所知 Unity3D是单线程的 它的工作原理是将继承基类的 脚本 c cs 文件 附加到 GameObject 此
  • 在 vim 中,+register 和 +register 与 .命令?

    我很难理解这个问题的解决方案维姆高尔夫挑战赛 http vimgolf com challenges 5192f96ad8df110002000002 最好的建议解决方案是 cw
  • Phonegap 之类的 Mac App Store 平台? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在使用phonegap 在iOS 本机应用程序中运行我的HTML JS 代码 有没有办法在 Mac
  • 线程终止时的 Java ExecutorService 回调

    我正在使用缓存线程池 ExecutorService 来运行一些异步后台任务 我提供了 ThreadFactory 它将线程分发给 ExecutorService 只要需要它们 我对缓存线程池的理解是 线程空闲 60 秒后 它会被 Exec
  • 如何在速度模板中显示图像

    如何在速度模板中显示此图像 显示图像需要什么配置吗 我有速度的java 配置 请帮我 提前致谢 非常感谢glw的热心回复 问题已经解决了 我忘记了电子邮件模板仅采用部署的实时图像路径 而不是像 src pageContext request
  • 嵌套列表的非递归遍历——在Python中构建类似的嵌套列表

    我需要遍历一个嵌套列表 处理每个非列表项str 并返回保持结构的类似列表 使用递归 这会相当容易 但我需要以这种迭代的方式进行 下面是我的尝试while loop def myiter e a e initial list c final
  • 是否可以在 .Net Windows 表单内托管 Microsoft Access 表单?

    我问是否可以在 Net 表单中托管 Microsoft Access 表单 不 我没有发疯 我们正在维护一个完全用 VBA 编写的庞大系统 由一个不太了解 VBA 的人尝试使用 Microsoft Access 作为 IDE 它基本上是数千
  • 媒体查询:根据屏幕尺寸限制一些CSS样式

    当我在layout css中编写一些样式时 它适用于每个屏幕尺寸和 Media Queries 部分 您有以下部分 Smaller than standard 960 devices and browsers Tablet Portrait
  • Contenteditable 显示最后插入的 html 元素

    我使用 contenteditable div 作为输入字段来输入一些文本 并通过该文本中的按钮 小 html 图片 插入图标 只要文本比 contenteditable 字段窄 就可以了 一旦文本比字段长 因此它被部分隐藏 当我输入文本字
  • Python:如何导入与子包同名的模块?

    我还没有遇到这个问题 但我很好奇如何导入与子包同名的模块 例如 可能的模块结构可能如下所示 mymodule init py string py 现在 如果我需要mymodule string分包and the string每个 Pytho
  • ZedGraph 垂直线与 LineObj 问题

    我有一个 ZedGraphControl 里面有几条曲线 我想在一些固定的 x 位置添加垂直线 当然 这些线只能位于实际图形区域内 我尝试以下 LineObj line new LineObj Color Black xPos myPane
  • jQuery 验证插件:验证自定义日期格式

    我正在使用 jQuery Validate 插件来验证我的表单 如何使用此日期格式 DD MMM YYY 2012 年 3 月 23 日 验证自定义日期 创建自定义验证器 http docs jquery com Plugins Valid
  • Xcode:将信息从 UITableViewController 传递到 UIViewController

    我有一个 UIViewController 它应该根据 UITableViewController 中按下的单元格向我显示详细信息 目前我正在给他们讲一个续集 override func prepare for segue UIStoryb
  • 返回空字符串:C++ 中的有效方法

    我有两种从函数返回空字符串的方法 1 std string get string return 2 std string get string return std string 哪一种更有效 为什么 Gcc 7 1 O3 这些都是相同的