Phi*_*lip 10 c++ multithreading copy-constructor stdthread visual-studio-2013
我正在阅读C++ Concurrency in Action一书,以了解有关线程和C++内存模块的更多信息.我很好奇在以下代码中调用复制构造函数的次数:
struct func
{
func() = default;
func(const func& _f) {}
void operator()() {}
};
int main()
{
func f;
std::thread t{ f };
t.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在Visual Studio 2013调试器中浏览此代码时,我看到复制构造函数分别被调用了四次.它从主线程调用三次,然后从新线程调用一次.我期待一个,因为它为新线程制作了一个对象的副本.为什么要创建三个额外副本?
如果在复制构造函数中设置断点,您可以在“调用堆栈”窗口中看到构造函数调用上下文。在调试模式下,当调用构造函数时,我发现了下一点:
首先,功能对象被复制到辅助函数中bind
然后将功能对象移动到内部功能对象中_Bind
之后_LaunchPad创建一个用于启动线程的类。在
构造函数中,它采用对 _Bind 实例的右值引用,因此我们有
另一个移动构造函数调用
_LaunchPad当在新线程中创建其副本时,将调用其移动构造函数。
因此,在您的情况下,我们有 4 个复制构造函数调用。如果添加了移动构造函数,您将看到 1 个复制构造函数和 3 个移动构造函数调用。
在发布模式下,所有空的构造函数调用都被省略,汇编代码看起来非常简单
| 归档时间: |
|
| 查看次数: |
608 次 |
| 最近记录: |