对于 std::string,复制初始化或直接初始化字符串文字更快吗?

2024-03-12

我有以下问题。应该遵循哪一项更好?为什么?

string strMyString = "SampleString";

or

string strMyString("SampleString");

我回答了here https://stackoverflow.com/questions/587070/c-constructor-syntax/587116#587116

我在这里的答案中加入了一件事:也不使用任何赋值运算符.

不过,对字符串特定事物的简短解释。std::string有一个构造函数接受一个参数char const*:

// simplified to a normal class declaration. std::string actually
// is a template instantiation. 
class string {
public:
    string(char const* str) {
        // copy over...
    }
};

现在您可以看到它有一个构造函数,它带有一个指向字符的指针。这样它就可以接受字符串文字。我认为以下情况是显而易见的:

string s("hello");

它会直接调用构造函数并初始化s从而。这就是所谓的直接初始化.

初始化变量的另一种方法称为复制初始化。标准规定,对于复制初始化的情况,初始化器具有not它正在初始化的对象的类型,初始化程序将转换为正确的类型。

// uses copy initialization
string s = "hello";

首先我们先来说一下类型

  • s具有 std::string 类型
  • "hello"是一个数组,在这种情况下再次像指针一样处理。因此我们将其视为char const*.

编译器会寻找两种方法来进行转换。

  • 有没有转换构造函数在 std::string 中?
  • 初始化器的类型是否具有返回 a 的转换运算符函数std::string?

它将创建一个临时的std::string通过其中一种方法来初始化对象s通过使用std::string's 复制构造函数。它看到std::string has接受初始值设定项的转换构造函数。所以它使用它。最后,它实际上与

std::string s(std::string("hello"));

请注意,您的示例中使用的表单触发了所有这些

std::string s = "hello";

定义一个隐式转换。您可以将构造函数标记为char const* as explicit对于您的类型,如果您想知道您的东西的初始化规则,并且它不允许使用相应的构造函数作为转换构造函数不再:

class string {
public:
    explicit string(char const* str) {
        // copy over...
    }
};

这样,使用初始化它copy initialization and a char const*实际上现在已经被禁止了(以及在其他地方)!

现在,如果编译器不支持在各个地方省略临时变量。编译器可以假设复制构造函数copies在这种情况下,可以消除临时字符串的额外副本,而是直接将临时 std::string 构造到初始化对象中。但是,复制构造函数必须特别可访问。所以,如果这样做的话,复制初始化是无效的

class string {
public:
    explicit string(char const* str) {
        // copy over...
    }

private: // ugg can't call it. it's private!
    string(string const&);
};

现在实际上,只有直接初始化的情况才有效。

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

对于 std::string,复制初始化或直接初始化字符串文字更快吗? 的相关文章

  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • 如果在构造函数中使用 super 调用重写方法会发生什么

    有两个班级Super1 and Sub1 超1级 public class Super1 Super1 this printThree public void printThree System out println Print Thre
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • 冒号在c中起什么作用?

    我在课堂上得到了这个例子 但我不确定它的作用 我知道冒号添加了一个位字段 但我仍然不确定这个问题 a b gt 0 3 1 运算符称为条件运算符 If b值为 gt 0 价值3被分配给a否则值1被分配给a 以 Kernighan Ritch
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 在 C# 命令行应用程序中包含并执行 EXE

    所以我找到了一个很棒的小 EXE 命令行应用程序 我们将其称为 program exe 它输出一些我想用 C 操作的数据 我想知道是否有一种方法可以将program exe 打包 到我的Visual Studio项目文件中 这样我就可以将编
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 检查一个数是否是完全平方数?

    我认为以下代码存在精度问题 bool isPerfectSquare long long n long long squareRootN long long sqrt n 0 5 return squareRootN squareRootN
  • 在 LP2844Z(Zebra 打印机)上的收据中包含 PNG [重复]

    这个问题在这里已经有答案了 我正在致力于创建一个基于 HTML5 画布的签名 绘图框 目前我们在服务器上将画布保存为PNG 但可以轻松地将base64字符串保存在数据库中 现在的问题是我们如何在打印的收据上添加签名 目前我们使用 GF 字段

随机推荐

  • 如何在 Spotify Android 应用程序中自动播放播放列表

    我正在尝试在 Spotify 应用程序中播放已知的播放列表 我最好的方法是加载播放列表 但不播放它 我尝试过两件事 首先从搜索开始播放 Intent intent new Intent MediaStore INTENT ACTION ME
  • 您是否使用花括号来确定额外的范围? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Dapper 将存储过程中的字段映射到具有不同名称的类属性

    我从包含许多字段的 POJO 类中摘录了以下内容 public class Call public int Id get set public string Customer get set public int StatusId get
  • 如何忽略触发器中的错误并在 MS SQL Server 中执行相应操作

    我已经创建了 AFTER INSERT TRIGGER 现在如果在执行触发器时发生错误的话 它不应该影响触发表上的插入操作 总之 如果触发器中发生任何错误 则应忽略它 正如我用过的 BEGIN TRY END TRY BEGIN CATCH
  • 如何检查画布是否为空白? [复制]

    这个问题在这里已经有答案了 如何检查 HTML5 画布是否为空白或具有彩色像素 有没有快速的方法呢
  • std::future 和 clang 与 -stdlib=libstdc++

    以下程序无法与 clang 和 stdlib libstdc 链接 cat future cpp include
  • Python 多处理:进程的进度报告

    我的应用程序中有一些任务受 CPU 限制 并且我想使用多处理模块来使用多核处理器 我接受一个大任务 视频文件分析 并将其分成几个较小的任务 这些任务放入队列中并由工作进程完成 我想知道的是如何从这些工作进程向主进程报告进度 例如 我需要他们
  • 如何在PHP中获取客户端IP地址

    如何使用 PHP 获取客户端 IP 地址 我想保留通过 IP 地址登录我的网站的用户的记录 Answer recommended by PHP collectives php Collective 无论您做什么 请确保不要信任客户端发送的数
  • 不相关实体的 HQL 左连接

    我有 2 个实体 A and B 它们是相关的 但我不想将关系映射添加到 bean 我们如何使用之间的左外连接A and B使用 HQL 或标准 有一些解决方法可以解决这个问题 按照指示使用本机 SQLhere https stackove
  • 大型 WCF Web 服务请求因 (400) HTTP 错误请求而失败

    我遇到过这个明显常见的问题 但无法解决 如果我使用数组参数中相对较少的项目 我已测试最多 50 个 来调用 WCF Web 服务 则一切都很好 但是 如果我调用包含 500 个项目的 Web 服务 则会收到错误请求错误 有趣的是 我跑过Wi
  • 从 Bash 函数返回字典

    我想在 bash 中有一个函数 它创建一个字典作为局部变量 用一个元素填充字典 然后返回该字典作为输出 下面的代码正确吗 function Dictionary Builder local The Dictionary unset The
  • python 的 random.Random.seed 是如何工作的?

    我习惯打字random randrange 我会做一个from random import Random从现在开始发现错误 对于涉及程序生成的游戏 不 不是 Minecraft 克隆 p 我想保留几个不同的伪随机数生成器 一个用于世界的生成
  • 使用传单和 R 向 CircleMarkers 添加边框

    我想为 CircleMarkers 添加边框 我使用了以下代码 我找不到任何为笔画添加黑色边框的功能 pal lt colorNumeric palette RdYlBu domain city results ratio m lt lea
  • 合并一个数组中的两个 int 数组,且不重复

    我正在尝试将两个数组合并为一个而不重复 但我的代码无法正常工作 谁能建议如何解决这个问题 void unify int set A int size A int set B int size B int set C int size C i
  • Flurry Android Analytics 中未获取报告

    我已将 Flurry Analytics 集成到我的应用程序中 但无法获取 Flurry Dashboard 上的报告 但我按照 Flurry ReadMe PDF 中提到的方式集成了它 我使用 API 密钥实现了所需的所有代码 但不知道为
  • Rails Devise:登录后如何访问注册页面?

    我是 Rails 新手 我正在使用 devise gem 进行身份验证 首先 我通过默认注册页面添加一个新用户 例如 users sign up 然后 我按照以下说明将 sign up 页面设置为仅对符号用户可用 在过滤器之前设计阻止访问
  • 从我的 git 历史记录中删除 4 个提交

    我已经完成了一些提交并将它们推送到我的存储库中 然后我做了一个拉取请求 但我意识到有一些提交我不想出现在拉取请求中 它们看起来像这样 My commits look like this Correct HTML ab1c41c HTML e
  • 使用 WiX 创建语言选择对话框

    我使用 WiX 创建了一个多语言安装程序 我正在使用命令从命令行运行安装程序 msiexec i myinstaller msi TRANSFORMS 1041 并且工作正常 现在我已经使用引导程序创建了一个语言选择对话框 如何将所选语言传
  • 如何将Win32 HRESULT转换为int返回值?

    我正在用 C 编写一个 Windows 控制台应用程序 希望在成功时返回零 在失败时返回有意义的错误代码 即 S OK应该返回 0 并且E OUTOFMEMORY应该返回不同的返回值E FAIL等等 以下是一个好的方法吗 int wmain
  • 对于 std::string,复制初始化或直接初始化字符串文字更快吗?

    我有以下问题 应该遵循哪一项更好 为什么 string strMyString SampleString or string strMyString SampleString 我回答了here https stackoverflow com