创建新线程时复制构造函数调用
Copy constructor calls when creating a new thread
我正在阅读《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 调试器中演练此代码时,我看到复制构造函数被调用了四次。它从主线程调用三次,然后从新线程调用一次。我期待一个,因为它为新线程制作了对象的副本。为什么要创建三个额外的副本?
如果在复制构造函数中设置断点,则可以在调用堆栈窗口中看到构造函数调用上下文。在调试模式下,我发现了调用构造函数时的下一点:
-
首先,将功能对象复制到辅助函数中
bind
然后将功能对象 移动到内部功能对象中
_Bind
之后,将创建一个用于启动线程
_LaunchPad
的类。在
一个构造函数,它对_Bind实例进行右值引用,所以我们有
另一个单移动构造函数调用
在新线程中创建
_LaunchPad
的副本时,将调用 Move 构造函数。
因此,在您的案例中,我们有 4 个复制构造函数调用。如果添加了移动构造函数,您将看到 1 个复制构造函数和 3 个移动构造函数调用。
在发布模式下,所有空的构造函数调用都被省略,汇编代码看起来非常简单
相关文章:
- 为什么默认复制函数在按值发送参数时不调用?
- 减少复制构造函数调用
- 复制elision、std::move和链式函数调用
- 在实现和调用时可以复制函数参数名称吗?
- linux 是否"rename"函数调用块,直到复制(当源和目标在不同磁盘中时)完成
- 在C++11中按值返回构造的对象时,避免复制构造函数调用
- 从复制构造函数调用构造函数
- 循环复制构造函数调用
- C++继承的复制构造函数调用
- 创建新线程时复制构造函数调用
- 转发构造函数调用基类的复制构造函数2次
- 复制构造函数调用错误
- 复制构造函数调用
- 使用 "new" 复制构造函数调用
- 复制构造函数调用
- 从定义的复制构造函数调用默认(隐式)复制构造函数
- 显式复制构造函数调用语法
- 如何让复制构造函数通过可变参数构造函数调用
- 复制构造函数调用 - 返回值
- 复制构造函数调用C++