我正在用 C++ 制作一个简短的(但在 CPU/GPU 使用方面很昂贵)粒子系统库,其中需要性能和模块化。我希望用户能够制作自己的仿函数并将它们传递给 update()
函数,从而准确确定给定集合的粒子将如何在每一帧中演化(一个仿函数用于颜色,用于规模,位置......)。
这需要通过引用或指针将仿函数传递给函数 update()
(作为抽象类参数),这意味着每次我在一个粒子上调用仿函数时,我的程序(和如果我错了请纠正我,我不确定我对缓存层的理解是否正确)会在从仿函数加载数据时生成缓存未命中,然后在我需要时重新生成缓存未命中迭代集合的下一个粒子。
这听起来像是对 CPU 时间的巨大浪费。我该如何解决?我对问题的理解是否正确?有什么问题吗?
最佳答案
Is there even a problem at all?
没有测量很难说。您是正确的,诸如引用和指针之类的间接寻址有可能损害性能。在您的特定程序中是否属于这种情况必须通过测量来确定。
您的问题的一个常用解决方案是接受仿函数作为模板参数,如下所示:
template <class Functor>
void update (Functor f){...}
这样,该函数甚至可能符合内联条件。
关于C++:仿函数的缓存友好性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34756482/