[英]Extra copy constructors when std::function is used
在我的项目中,有两个部分:生产者和消费者。 生产者负责处理一些信息并将结果提供给消费者。 结果在功能对象的帮助下传递。
我正在使用一个函数来传递此信息。 您可以在下面的代码中看到它的外观。
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class Data {
std::vector<int> vec;
public:
Data() {
cout << "Data()" << endl;
}
Data(const Data& rr) : vec(rr.vec) {
cout << "Data(Data&)" << endl;
}
~Data() {
cout << "~Data()" << endl;
}
Data(Data&& rr) : vec(move(rr.vec)) {
cout << "Data(Data&&)" << endl;
}
void get() {
}
};
class Producer {
public:
void process(function<void(Data)> f) {
Data data;
f(move(data));
}
void process2(void(&pf)(Data)) {
Data c;
pf(move(c));
}
};
void Consume(Data a) {
cout << "Consume(data)" << endl;
}
int main() {
{
cout << "use function() " << endl;
Producer p;
p.process([](Data a) {
cout << "Consume(data)" << endl;
});
}
{
cout << endl;
cout << "use function pointer" << endl;
Producer p;;
p.process2(Consume);
}
return 0;
}
它具有以下输出
use function()
Data()
Data(Data&&)
Data(Data&)
Data(Data&)
Consume(data)
~Data()
~Data()
~Data()
~Data()
use function pointer
Data()
Data(Data&&)
Consume(data)
~Data()
~Data()
使用函数对象时,还有其他的复制构造函数。
我做错什么了吗? 是否有可能摆脱这些额外的构造函数?
先感谢您。
我正在使用VC10 SP1。
您在这里有一些选择。
std::function
,您的非捕获lambda可转换为void(*)(Data)
std::function
,请创建您的函数模板,编译器可以推断出lambda的隐藏类型。 std::unique_ptr
可能会更有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.