微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

复制无状态对象lambdas的成本?

如何解决复制无状态对象lambdas的成本?

如何知道通过复制 lambda 来创建对象是否有成本?

template<typename Lambda>
class A {
public:
  A(Lambda lambda) : _lambda(lambda) {} // const Lambda& lambda less efficient?
  auto call(double x) { return _lambda(x); }
private:
  Lambda _lambda; // is const Lambda& _lambda less efficient?
};

如果 lambda 没有状态,我想知道拥有引用是否代价高昂或无关紧要(与复制 lambda 相同)?

解决方法

如何知道通过复制 lambda 来创建对象是否有成本?

通过使用您打算使用的特定编译器(和开关)进行测试和分析。其他任何事情都是对您尚未确定的实施质量做出假设。

,

这里的引用会非常脆弱;如果您将其作为参考,您遇到错误。

Lambda 本身可以选择成为外部状态的引用;只需复制它们并按值存储它们。如果在特定用例中对此有性能损失,调用者可以避免复制成本。

template<class F>
class A {
public:
  explicit A(F f_in) : f(std::move(f_in)) {}
  decltype(auto) call(double x) { return f(x); }
private:
  F f;
};

只是一些代码质量的变化。

,

非常简单的测试表明简单的 lambda 是空对象:

template<typename Lambda>
class Test
{
public:
    Test(Lambda _lambda):lambda(_lambda){}

    Lambda lambda;
};

int main()
{
    const auto lambda=[](double x){return x;};
    Test test=lambda;
    //print 1 1
    std::cout<<sizeof(lambda)<<" "<<sizeof(test)<<std::endl;
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。