将没有成员的函子设置为类成员对象还是堆栈对象更有效

Is it more efficient to make an functor with no members a class member object or a stack object?

本文关键字:成员对象 堆栈 对象 有效 成员 设置      更新时间:2023-10-16

我有一个没有成员变量的函子。我想知道根据需要动态创建此函子或将其缓存为成员变量是否更有效。关于空基类优化和缓存局部性存在我不确定的问题。

struct Foo
{
int operator()(const MyData& data) const { ... }
};

对于空对象,只需在堆栈中创建它。将函子作为成员添加到类型将使所有对象变大。将其添加为基(以利用空基优化)将产生一个奇怪的设计,其中您的类型无缘无故地实现operator()(const MyData&)。即使您将其设为私有,运营商也会在那里。

由于该类型没有成员,因此不存在缓存局部性问题,因为没有要访问的数据。无状态函子的主要用途是允许编译器内联对函数的调用(与同名的自由函数相比)

优化的一般规则是:首先编写代码使其工作,仅在证明有必要时才进行优化(换句话说,您已经分析了代码并发现了需要解决的瓶颈,以大大提高性能)。