std::async 和对象复制

2023-12-06

我正在尝试std::async最终得到如下代码:

class obj {
public:
    int val;

    obj(int a) : val(a) {
        cout << "new obj" << endl;
    }
    ~obj() {
        cout << "delete obj" << endl;
    }
};


void foo(obj a) {

    this_thread::sleep_for(chrono::milliseconds(500));
    cout << a.val << endl;
}

int main(int argc, int **args) {

    obj a(5);
    auto future = async(foo, a);
    future.wait();

    return 0;
}

结果是:

new obj
delete obj
delete obj
delete obj
5
delete obj
delete obj
delete obj

然后我尝试改变void foo(obj a) by void foo(obj &a) :

new obj
delete obj
delete obj
delete obj
5
delete obj
delete obj

为什么要为这个简单的代码创建我的对象的 5 个副本? 我必须承认,我真的很困惑。有人愿意解释一下吗?

Edit

我用的是VS2012


就你而言,obj正在复制:

  1. 两次通过电话std::async.
  2. 两次通过async的内部呼叫std::bind.
  3. 一旦接到电话void foo(obj a)因为它需要a按价值。

不管你信不信,副本数量实际上已经自 VC10 以来减少.

看到一个库(无论是标准库还是另一个库)触发比您预期的类型更多的副本并不罕见。通常,您对此无能为力。

人们通常会做两件事来防止复制:

  1. Take obj通过引用(或者在您的情况下,const ref 因为foo不修改obj)。这将需要使用std::ref与异步。
  2. 定义一个移动构造函数 for obj。这不会阻止临时对象的构建和销毁,但它会给您一个稍微优化过程的机会。

请注意,在您仅持有一个对象的裸示例中int,实际上复制可能比移动或通过引用传递更快。


通过示例obj通过引用进入async:

void foo(const obj& a) {
    this_thread::sleep_for(chrono::milliseconds(500));
    cout << a.val << endl;
}

int main(int argc, int **args) {
    obj a(5);
    auto future = async(foo, std::cref(a));
    future.wait();

    return 0;
}

定义移动构造函数的示例:

class obj
{
public:
    /* ... */

    obj(obj&& a) : val(move(a.val)) {
        // It is good practice to 0 out the moved object to catch use-after-move bugs sooner.
        a.val = 0;
    }

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

std::async 和对象复制 的相关文章

随机推荐

  • 适用于 Chrome 的 Android ARC 应用程序,为不同的活动/布局设置窗口大小

    对于那些不知道什么是 ARC 的人 https developer chrome com apps getstarted arc 如何根据正在运行的活动或可见的布局手动设置窗口的大小 比如这个活动太高 太宽 虽然我希望下一个活动是全屏的 窗
  • 使用 .DrawToBitmap - 如何更改图像的分辨率?

    我在用着DrawToBitmap将一些标签保存为图像 我想知道如何改变这些图像的分辨率 有什么办法吗 假设我有一个带有文本的标签 我想将其渲染为图像文件 不发布完整代码 this label1 new System Windows Form
  • 使用 LibGit2Sharp 进行 Bitbucket 身份验证

    我使用 CSharp Bitbucket 库通过 Bitbucket 对用户进行身份验证 https github com scottksmith95 CSharp Bitbucket 身份验证工作正常 我得到了令牌值和令牌秘密值 我已经在
  • 无法在 xcode 中调整视图大小

    我似乎无法调整视图大小以填充模拟器中的屏幕 请参见下面的屏幕截图 注意顶部和底部的黑线 有谁知道我如何解决这个问题 Thanks Matt 此问题的原因是您尚未在项目中添加启动图像或故事板 您需要将启动图像添加到您的xcasset文件夹或者
  • C++ 中 i++++ 增量是什么

    谁能告诉我c 中i 自增的过程是什么 这是一个语法错误 使用最大咀嚼规则 i 被标记为 i 最后 是二元加法运算符 但显然它没有两个操作数 这会导致解析器错误 EDIT 评论中的问题 我们可以吗i j 它被标记为 i j 这又是一个语法错误
  • 跨多种语言的语义相似度

    我正在使用词嵌入来查找两个句子之间的相似性 使用 word2vec 如果一个句子是英语 另一个句子是荷兰语 我还可以获得相似性度量 尽管不是很好 所以我开始想知道是否可以计算两种不同语言的两个句子之间的相似度 没有明确的翻译 特别是如果这些
  • 通过命令行控制劳特巴赫

    我的条件是我必须将多个输出文件一一刷新到 mpc 控制器 我们使用lauterbach的GUI来进行软件的烧写和运行 现在我想通过 gt 命令行参数做同样的事情 请有人向我解释一下通过命令提示符控制劳特巴赫需要什么 我想使用 Lauterb
  • 使用 jQuery 切换下一个元素

    我有一个问题this元素 我知道如何this工作中 我有很多这样的 html 结构 当我点击 a 按钮时 带有 class 的 divextra options必须显示 但由于我在整个过程中重复了很多相同的 html 结构 因此当我单击按钮
  • 为什么我的自定义字体在某些浏览器中存在位置偏移?

    在我的网站 www monkey touch com 上工作时 我开始在标题和其他几个地方使用自定义字体 它看起来很棒 并且由于 font squirrel 它可以在所有浏览器上运行 然而 我后来意识到字体在某些浏览器中的呈现方式有所不同
  • 应用程序小部件中的 AdapterViewFlipper:setPendingIntentTemplate() 和 setOnClickFillInIntent() 不起作用

    我正在将应用程序小部件中的 ListView 更改为 AdapterViewFlipper 问题是 我需要处理对某个项目的点击 它可以完美地使用 setPendingIntentTemplate 将待处理的意图模板设置为整个 ListVie
  • 将 UIImageView 转换为 UIImage

    我正在处理图像 我有大量图像 并且我正在从服务器实时下载它们 然后使用AsyncImageView类 但知道我正在使用自定义类 这需要UIImage代替UIImageView 问题 有什么好的方法可以转换吗UIImageView to UI
  • 按下后退按钮时完成所有活动

    我有一个 Android 应用程序 有 3 个活动 对于第一个和第二个活动 我希望后退按钮退出所有现有活动 此时后退按钮正在退出它启动的活动 但如果在第二个活动上按下后退按钮 则将显示第一个活动 而不是退出应用程序 因为第一个活动会导致第二
  • Cloud Firestore 相当于实时数据库“.info/connected”参考吗?

    我已开始从 Firebase 实时数据库迁移到 Cloud Firestore 我需要一种方法 让应用程序在 Firestore 的连接状态发生变化时 从在线到离线 反之亦然 收到警报 为了清楚起见 我不需要将其写入数据库以供应用程序的其他
  • 与其他人分享来自 mpldatacursor 的图像

    我正在使用这个例子当鼠标悬停在数据上时如何显示数据标签制作当您将鼠标悬停在点上时会出现数据的图像 这确实很好用 但是有什么方法可以保存它以便我可以将图像发送给其他人吗 我不确定哪些格式支持 工具提示 但 pdf 和 svg 都支持 也许还有
  • Sql Server 2005 全文搜索中的干扰词

    我正在尝试对数据库中的一系列名称进行全文搜索 这是我第一次尝试使用全文搜索 目前 我输入输入的搜索字符串 并在每个术语之间放置一个 NEAR 条件 即输入的短语 Kings of Leon 变为 Kings NEAR of NEAR Leo
  • Lotus Notes XPage 用于设计,Oracle(或其他 RDBMS)用于数据

    我计划使用 XPage 进行设计 加上 Lotus Notes Elements 来制作一个 Web 应用程序 但我不会将数据存储在 Lotus Notes 中 而是将数据存储在 RDBMS 特别是 Oracle 数据库 中 正如您所看到的
  • 如何在 Python 中检查文件大小?

    如何在Python中获取文件的大小 Use os path getsize gt gt gt import os gt gt gt os path getsize path to file mp3 2071611 输出以字节为单位
  • 我需要在添加新组件时动态调整 JPanel 的大小

    我需要让用户向我的 JFrame 添加更多文本字段 因此一旦框架的大小超过其原始值 滚动窗格就会介入 由于我无法将 JScrollPane 添加到 JFrame 以启用滚动 所以我决定将 JPanel 放在JFrame 并将 JPanel
  • Docker 身份验证:无法获取匿名令牌

    我的 gitlab 运行程序中出现以下错误 错误 授权失败 无法获取匿名令牌 获取 https auth ipv6 docker com token scope repository 3Alibrary 2Fnode 3Apull serv
  • std::async 和对象复制

    我正在尝试std async最终得到如下代码 class obj public int val obj int a val a cout lt lt new obj lt lt endl obj cout lt lt delete obj