繁体   English   中英

使用std :: function时的额外副本构造函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM