gpt4 book ai didi

c++ - 创建新线程时复制构造函数调用

转载 作者:可可西里 更新时间:2023-11-01 16:22:40 26 4
gpt4 key购买 nike

我正在阅读《C++ 并发实战》一书,以了解有关线程和 C++ 内存模块的更多信息。我很好奇复制构造函数在以下代码中被调用的次数:

struct func
{
func() = default;
func(const func& _f) {}

void operator()() {}
};

int main()
{
func f;
std::thread t{ f };
t.join();

return 0;
}

当我在 Visual Studio 2013 调试器中遍历这段代码时,我看到复制构造函数被调用了四次。它从主线程调用了三次,然后从新线程调用了一次。我期待一个,因为它为新线程制作了对象的拷贝。为什么要创建三个额外的拷贝?

最佳答案

如果您在复制构造函数中设置断点,您可以在“调用堆栈”窗口中看到构造函数调用上下文。在 Debug模式下,我在调用构造函数时发现了下一点:

  • 首先将功能对象复制到辅助函数 bind

  • 然后函数对象被移动到一个内部函数对象_Bind

  • 之后创建用于启动线程的类 _LaunchPad。在
    一个构造函数,它采用对 _Bind 实例的右值引用,所以我们有
    另一个移动构造函数调用

  • _LaunchPad 的移动构造函数在新线程中创建它的拷贝时被调用。

因此在您的案例中我们有 4 个复制构造函数调用。如果您添加移动构造函数,您将看到 1 个复制构造函数和 3 个移动构造函数调用。

在 Release模式下,所有空的构造函数调用都被省略,汇编代码看起来非常简单

关于c++ - 创建新线程时复制构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20886526/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com