C ++:与仿函数的缓存友好性

时间:2016-01-13 00:40:07

标签: c++ pointers caching reference

我在C ++中制作一个简短(但在CPU / GPU使用上很昂贵)的粒子系统库,其中需要性能和模块性。我希望用户能够创建自己的仿函数并将它们传递给update()函数,确切地确定给定集合的粒子将如何演化每个帧(一个仿函数用于颜色,用于比例,位置...)。

这需要通过引用或指针将函数传递给函数update()(作为抽象类参数),这意味着每次我在一个粒子上调用一个函子,我的程序(如果我',请纠正我)我错了,我不确定我对缓存层的理解是否正确)在从仿函数加载数据时会产生缓存未命中,然后当我想迭代下一个时重新生成缓存未命中集合的粒子。

这听起来像是浪费CPU时间。我怎么能解决它?我对问题的理解是否正确?甚至还有问题吗?

2 个答案:

答案 0 :(得分:2)

  

有没有问题呢?

没有测量就很难分辨。你是正确的,诸如引用和指针之类的间接可能会损害性能。无论您的具体计划是否属于这种情况,都必须通过测量来确定。

经常使用的解决方案是将仿函数作为模板参数接受,如下所示:

template <class Functor>
void update (Functor f){...}

这样,该功能甚至可以用于内联。

答案 1 :(得分:1)

用这些东西测量性能是非常重要的。

根据CPU的不同,这可能很昂贵或几乎免费。对不起,我不知道详细信息,但我知道在我自己的经历中,我已经看到了相同代码的不同配置文件。

我相信大多数现代CPU会缓存指针并通过其间接分​​支进行推测,就像调用函数返回一样。

然而,这里最好的C ++技术是将你的函数变成一个模板,它可以接受看起来像函数调用的任何参数。

通过这种方式,编译器可以将函数内联到函数中,从而消除任何可能的惩罚。