我应该将 std::string 与“string”或“string”进行比较吗?

2024-04-12

考虑这个代码片段:

bool foo(const std::string& s) {
    return s == "hello"; // comparing against a const char* literal
}

bool bar(const std::string& s) {
    return s == "hello"s; // comparing against a std::string literal
}

At first sight https://godbolt.org/z/fIppl1, it looks like comparing against a const char* needs less assembly instructions1, as using a string literal will lead to an in-place construction of the std::string.

(编辑:正如答案中所指出的,我忘记了有效的事实s.compare(const char*)将被叫入foo(),所以在这种情况下当然不会进行就地施工。因此删除下面的一些行。)

但是,看看罢工>

所有比较均通过compare()成员函数。

根据我的理解,这意味着我们需要构建一个std::string无论如何,为了执行比较,所以我怀疑开销最终会是相同的(尽管通过调用隐藏operator==).


Neither.

如果你想变得聪明,就比较一下"string"sv https://en.cppreference.com/w/cpp/string/basic_string_view/operator%22%22sv,它返回一个std::string_view https://en.cppreference.com/w/cpp/string/basic_string_view.


与字面意思比较时"string"不会导致任何分配开销,它被视为空终止字符串,并具有所有伴随的缺点:不能容忍嵌入的空值,并且用户必须注意空终止符。

"string"s进行分配,除非小字符串优化 https://stackoverflow.com/questions/56425276/inconsistent-behavior-of-compiler-optimization-of-unused-string or 分配省略 https://stackoverflow.com/questions/31873616/is-the-compiler-allowed-to-optimize-out-heap-memory-allocations。此外,运算符会传递文字的长度,无需计数,并且它允许嵌入空值。

最后使用"string"sv结合了其他两种方法的优点,避免了各自的缺点。也std::string_view是一个比a简单得多的野兽std::string,特别是如果后者像所有现代的那样使用 SSO。


至少从 C++14(通常允许省略分配)开始,理论上,只要有足够的信息(通常可用于示例)和努力,编译器就可以将所有选项优化到最后一个选项。假设规则 https://stackoverflow.com/questions/15718262/what-exactly-is-the-as-if-rule。但我们还没有到那里。

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

我应该将 std::string 与“string”或“string”进行比较吗? 的相关文章

随机推荐

  • 反向传播实现问题

    我应该做什么 我有一个黑白图像 100x100px 我应该训练一个反向传播 http en wikipedia org wiki Backpropagation神经网络与该图像 输入是图像的 x y 坐标 从 0 到 99 输出是 1 白色
  • 使用tensorflow-gpu获得可重现的结果

    使用 Tensorflow 处理项目 但是 我似乎无法重现我的结果 我尝试过设置图形级别种子 numpy 随机种子甚至操作级别种子 然而 它仍然无法重现 在 Google 搜索中 大多数人都将罪魁祸首归咎于 reduce sum 函数 因为
  • AS3:将变量转换为动态类型

    是否可以动态地将变量转换为类型 其中类型将是类型的变量Class 考虑以下因素 无效 var myClass Class MyClass var myInstance myClass new myClass 对于上下文 我正在 Flex 4
  • 使用 Swift 以编程方式闪烁屏幕(在“屏幕截图”上)

    为了从这里转换 Objective C 示例 如何以编程方式闪烁屏幕 https stackoverflow com questions 5254508 how to flash screen programmatically我写了以下代码
  • 撤消核心数据更改的操作名称

    我正在寻找一种内置 或易于实现 的方法来让核心数据撤消 重做操作名称读起来像 撤消编辑名字 而不是像它们那样简单地 撤消 或 重做 默认情况下 我有一个核心数据应用程序 并且正在使用它NSUndoManager作为我的 Windows 撤消
  • Spring RedisTemplate:8次调用后方法键挂起

    我使用 Spring RedisTemplate spring data redis 1 7 1 与 Redis 进行通信 我需要通过正则表达式获取然后删除键 例如 context user1 我用的方法 RedisTemplate key
  • Dagger - 在不同组件上获取相同实例

    我遇到了类似的问题this https stackoverflow com questions 40745279 dagger 2 provide same instance between multiple component with
  • 如何用UML表示通信协议?

    在我的 UML 模型中 我有一个系统及其相互通信的子组件 例如 我有一台计算机和一个遥控机器人 它们通过蓝牙进行通信 目前图中的流程类似于 计算机 触发 遥控车 的 setVelocity 函数 在这一点上 我想通过说以下的话来完善沟通 计
  • 使用 Powershell 在单独的单独行上列出完全路径文件名?

    如果我执行 Get ChildItem ext recurse 输出由一系列目录部分组成 后跟由所述目录部分分隔的每个匹配文件的一列或多列信息 有类似 Unix find 命令的东西吗 其中每个匹配的文件名及其完整的相对路径都出现在一行中
  • 原生 JavaScript 中的 jQuery.getScript 替代方案

    我正在尝试动态加载 JS 脚本 但不能使用 jQuery 我检查了 jQuery 源代码以了解如何获取脚本 http api jquery com jQuery getScript 已实现 以便我可以使用该方法使用本机 JS 加载脚本 但是
  • Silverlight 绑定到 TranslateX

    我有一个简单的 winphone7 应用程序 但我认为这适用于任何 silverlight 基本上我有一个椭圆 我想用平移 X 和 Y 属性来移动它 这是我的尝试
  • 在.net winform中创建圆角容器

    我想在 winform net 中创建圆角容器 我的目标是创建一个容器 这样如果我将任何其他控件放入其中 该控件也将变成圆形 这可能吗 您正在寻找Control Region财产 http msdn microsoft com en us
  • PDF 可以在 Chrome 中呈现,但不能在 Acrobat 中呈现

    PDF 1 7 4 0 obj lt ObjStm N 3 First 14 Length 139 gt gt stream 1 0 2 41 3 76 lt Catalog Version 1 7 Pages 2 0 R gt gt lt
  • Vs2017:查找资源字典时出错

    当我尝试引用我的 app xaml 文件的资源字典时 出现以下错误
  • 使用 Promise 时保留变量的最佳实践[重复]

    这个问题在这里已经有答案了 我是 Promises 的新手 我想知道在沿着链向下的同时保留变量的最佳实践是什么 通过 Promise 连接到 MongoDB 非常简单 connectToMongoDB data done function
  • 奇数耙数据库:迁移输出

    为什么rake db migrate run Execute db schema dump我的输出全部搞砸了 显示 SQL 看起来像这样 ActiveRecord SchemaMigration Load 0 5ms SELECT sche
  • FastAPI,返回带有 sql 查询输出的文件响应

    我正在使用 FastAPI 目前我返回一个 csv 这是我用 pandas 从 SQL Server 读取的 pd read sql 然而 csv 对于浏览器来说相当大 我想用文件响应返回它 https fastapi tiangolo c
  • Java 点与“任何字符”不匹配

    点应该匹配任何字符 那么为什么这个正则表达式不起作用呢 String url http wikipedia org System out println url replace htt Output http wikipedia org S
  • 是否可以将文件附加到 ios 日历事件?

    在 Mac OS 中 可以将文件附加到日历事件并读取 iOS 日历上的 dat 文件 问题 是否可以使用 Event Kit 框架将文件附加到 iOS 日历事件 我在中找不到任何提示事件套件文档 https developer apple
  • 我应该将 std::string 与“string”或“string”进行比较吗?

    考虑这个代码片段 bool foo const std string s return s hello comparing against a const char literal bool bar const std string s r