提问人:user19179144 提问时间:2/7/2023 最后编辑:user19179144 更新时间:2/14/2023 访问量:91
如何在没有太多复制/粘贴代码的情况下创建相同算法的优化变体?(C++)
How to create optimized variations of the same algorithm without too much copy/paste code? (C++)
问:
当我为实时优化目的(例如音频或图形处理)编写 C++ 代码时,我经常遇到以下问题:
我需要几种代码变体,但它们的内部循环只有一些微小的变化。大多数情况下,这种所需的变化是算法输出结果的方式。即,它是否应该替换输出缓冲区中的先前数据,是否应该将其与缓冲区中的先前数据相加,或者是否应该将其相乘,等等。
复制粘贴整个方法并仅更改内部循环中一行中的几个字符感觉像是一种糟糕的做事方式。
相当有效地解决这个问题的一种方法是始终使用一些简单的混合配方,您可以给出参数,例如:
*p_buffer++ = A*(*p_buffer) + B*new_value + C;
然后,您可以简单地将 A、B 和 C 交给该算法并完成它。但这感觉像是在浪费 CPU 周期。此外,如果缓冲区尚未使用有效的浮点值初始化,并且存在 NAN,则结果也可能是 NAN,即使您打算将缓冲区中的前一个值乘以 0。
那么,有没有另一种有效的方法可以在不牺牲速度的情况下为方法创建这些类型的变体呢?我希望为我使用的每个变体提供单独的方法。例如:
Render();
RenderAdditive();
RenderMultiplicative();
RenderSomeOtherWay();
编辑: 根据答案,我将方法定义为:
template<int TYPE> void Render(...)
{
if constexpr (TYPE == 0)
*p_output_buffer++ = data;
if constexpr (TYPE == 1)
*p_output_buffer++ += data;
if constexpr (TYPE == 2)
*p_output_buffer++ *= data;
}
这种方法效果很好。 感谢大家的帮助!
答: 暂无答案
评论
std::function
if constexpr