循环展开和元编程(TMP)
loop unrolling and metaprogramming(TMP)?
读取 [编译时代码优化] 编译器实例化上述函数模板时,可能会产生以下代码:[需要引用] 编译器的优化器应能够展开for循环,因为模板参数长度在编译时是常数。 但是,请谨慎行事,因为这可能会导致代码膨胀,因为将对您实例化的每个" n"(向量大小)生成单独的展开代码。 但是,我在编写TMP代码时学会了,应该避免循环,因为它是运行时,并且使用模板递归是一个变化。 我已经在Google上进行了搜索编辑,并找到了该问题,该问题是手动的。答案还鼓励使用递归。 因此,我应该依靠编译时代码优化,能够使用编译时长度(循环的结尾)在编译时间或始终使用递归? 我认为Wikepedia的文章鼓励我们依靠Un-Roll。也许我误会了?template <int length>
Vector<length>& Vector<length>::operator+=(const Vector<length>& rhs)
{
for (int i = 0; i < length; ++i)
value[i] += rhs.value[i];
return *this;
}
template <>
Vector<2>& Vector<2>::operator+=(const Vector<2>& rhs)
{
value[0] += rhs.value[0];
value[1] += rhs.value[1];
return *this;
}
循环展开与模板无关(至少一般而言)。当已知尺寸时,编译器可以展开循环(它们也可能能够展开静态界限的循环,但这要困难得多)。
如果您使用模板递归,这仅意味着您可以控制循环展开的方式。
无论如何,不要尝试进行过早的优化...滚动循环不太可能是您的运行时成本问题。让编译器展开至少是免费的,而独自行动有点痛苦且容易出错,而不确定结果是否值得付出努力。
从我的经验循环展开到一定长度。我猜如果代码生长太大,这对缓存产生负面影响,并且导致少于最佳性能
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 模板元编程:如何将参数包组合成新的参数包
- Qt Q串行端口未编程设备未关闭
- 提供与TMP和SFINAE的通用接口
- 模板元编程 - 尝试实现维度分析
- 我是编程新手
- 节点 *temp; 和节点 *tmp = 新节点之间的差异
- C++编程从外部文本文件定义数组大小
- 了解算法的性能差异(如果以不同的编程语言实现)
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 使用命名空间正确编程
- C++编程:运算符重载中的引用如何工作?
- Arduino 模块化编程与全局和设置
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- 循环展开和元编程(TMP)
- 如何在C++中减少TMP和宏预处理器元编程的编译时间?