绕过 C++ 中的复制语义

2024-04-22

请考虑这段代码:

class A
{

};

int main()
{
    std::vector<A> test;
    test.push_back(A());
}

构造函数和析构函数将被调用两次,内存将被分配两次并且对象将被复制,现在这不仅可能对性能不利,还可能导致运行时错误,特别是如果析构函数中正在进行一些清理。我通常解决这个问题的方法是创建一个指针向量:

std::vector<A*> test;
test.push_back(new A());

我的问题有两个,这是常见做法还是好的做法?或者,还有更好的方法? 如果事实证明这是一个骗局,请告诉我,我会关闭问题,但我在搜索中找不到任何内容。


Use emplace_back http://en.cppreference.com/w/cpp/container/vector/emplace_back.

std::vector<A> test;
test.emplace_back();
//test.emplace_back(constructor, parameters);

这边走,A将就地构建,因此不会发生复制或移动。

编辑:澄清对这个问题的评论 - 不,这不会改变push_back如果你暂时通过它。例如,

test.emplace_back(A{});

在 C++11 中,将导致临时 A 被构造、移动和销毁,就像您使用push_back.

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

绕过 C++ 中的复制语义 的相关文章

随机推荐

  • 如何从ajax加载数据到zabuto日历插件?

    作为标题 我尝试将数据从 ajax 加载到 zabuto 日历 但似乎不起作用 参考 zabuto 日历http zabuto com dev calendar examples show data html 我想在单击上个月或下个月的导航
  • 日历应该用表格来表示吗?为什么 Google 日历只使用表格作为列?

    这不是另一个一般的 一般布局的表格与 div 元素 类型的问题 例如 为什么不使用表格来布局 https stackoverflow com questions 83073 why not use tables for layout in
  • Rails:如何增加模型选定实例的整数字段?

    Buyer模型有两个字段 名称 字符串 位置 整数 我想增加position在所有买家中position gt N 最简单的方法是什么 是否可以仅使用一个查询来实现这一目标 你可以使用 Buyer update all position p
  • FireStore 创建一个文档(如果不存在)

    我想更新这样的文档 db collection users doc user id update foo bar 但是 如果文档 user id 不存在 上面的代码将抛出错误 因此 如果学生不存在 如何告诉 Firestore 创建学生 换
  • 当 JUnit 5 外部测试用例失败时,不要启动嵌套测试用例

    我有以下测试类 import org junit jupiter api Nested import org junit jupiter api Test import org junit jupiter api TestInstance
  • Rails 5.1 路由:动态:动作参数

    Rails 5 0 0 beta4 在包含动态 action 和 controller 段的路由上引入了弃用警告 DEPRECATION WARNING Using a dynamic action segment in a route i
  • 如何突出显示Recycler View中选定的Item?

    我有一个回收站视图 其中包含从内部存储加载的图像 我想在单击时突出显示所选项目 我尝试了很多东西但没有成功 实际上 我需要的是 当我单击回收器视图中的任何项目时 该项目必须进入我的ArrayList 并且它也应该突出显示 并且当我单击或取消
  • Sklearn 随机森林回归器的错误

    当尝试使用 y 数据拟合随机森林回归器模型时 如下所示 0 00000000e 00 1 36094276e 02 4 46608221e 03 8 72660888e 03 1 31375786e 04 1 73580193e 04 2
  • 如何从 iPhone 中删除 coredata

    您知道当您更改实体结构时如何重置 iPhone 模拟器上的核心数据存储吗 当我创建的核心数据存储的新版本与我上次在 iPhone 上运行的版本不同时 是否需要执行类似的过程 如果可以的话 请问如何 Thanks 只是为了方便起见 除非您编写
  • CMS 在 .NET 中使用不在本地受信任证书存储中的证书链进行签名

    我有存储在网络上的 X509 证书 我可以从远程 Windows 证书存储中读取链 我需要签署一些数据并将链包含到签名中 以便以后可以对其进行验证 问题是我找不到将证书链放入 CsmSigner 的方法 我读到它从构造函数参数中获取证书并尝
  • PostgreSQL:“按分钟”运行查询的行数

    我需要每分钟查询截至该分钟的总行数 到目前为止我所能达到的最好成绩并不能解决问题 它返回每分钟的计数 而不是每分钟的总计数 SELECT COUNT id AS count EXTRACT hour from when AS hour EX
  • Python BigQuery 超时确实很奇怪

    我正在构建一项将数据流式传输到 bigquery 的服务 如果我删除需要 4 5 分钟加载的部分 我正在预缓存一些映射 则以下代码可以完美运行 from googleapiclient import discovery from oauth
  • Ruby 2.3 - 向 net:http 请求添加超时错误和通知

    我有一个工作系统可以产生错误并将其发送给活动管理员使用 例如 在活动管理中 对于我们 CMS 的特定页面 该页面可能会执行 url must be accessible http www exmaple com field url part
  • 使用 stack 安装 shuffle 库时出错

    Using stack 1 2 0 and LTS 7 0我在安装时遇到以下错误shuffle https hackage haskell org package shuffle 图书馆 cabal get shuffle cd shuff
  • 滚动时删除#anchor-id

    我正在使用这个jqueryhttp css tricks com examples SmoothPageScroll http css tricks com examples SmoothPageScroll 创建平滑的页面滚动 但是每次我
  • 加入同一存储库旧版本的历史记录

    我有一个包含这段历史的存储库 A B C D 然后 这个存储库被 拆分 基本上 使用 git subtrees 创建了另一个存储库 其历史记录从 D 开始 现在 我有另一个具有这段历史的存储库 The same D as the other
  • 使用 C# 写入 Excel 文件的最佳和最快方法是什么?

    我正在尝试使用 OLEDB 没有自动化 写入 Excel 文件 我有大约 500 行数据 这些数据是从其他应用程序获取的 然后使用 INSERT INTO 查询将其一一写入 Excel 文件 我确信从其他应用程序读取数据没有延迟 我查了一下
  • 发现同一依赖程序集的不同版本之间存在冲突

    我目前使用 net 3 5 框架和 microsoft interops 在 Visual Studio 中编写一个程序来与 Office 产品交互 我的 app config 文件有问题 每次我编译我的解决方案 重建或构建它时 错误列表中
  • 高分辨率图像 IE 浏览器渲染

    我正在针对这些更高分辨率的显示器 尤其是新的 iPad 优化我的网站 我按照我想要的方式格式化了网站 我只是增加了每个图像的分辨率 但仍然将其限制为我当前拥有的 DIV 例如 我有一个分辨率为 483x246 的图像 并将其适合设置大小为
  • 绕过 C++ 中的复制语义

    请考虑这段代码 class A int main std vector a test test push back A 构造函数和析构函数将被调用两次 内存将被分配两次并且对象将被复制 现在这不仅可能对性能不利 还可能导致运行时错误 特别是