复制无状态对象(lambdas)的成本?
Cost of copying stateless objects (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 是空对象:
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;
}
How can one find out if there is a cost in creating an object by copying a 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 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 是空对象:
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;
}
How can one find out if there is a cost in creating an object by copying a 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;
};
只是一些代码质量更改。