作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在阅读《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/
嘿。本周的一个教程,其中一个问题要求通过使用其他函数 formatLine 和 formatList 创建一个函数 formatLines,以格式化行列表。 我的代码是这样的; type Line =
我是一名优秀的程序员,十分优秀!