c++ - 在 C++ 中模板化一个 'for' 循环?

标签 c++ optimization templates metaprogramming

我在下面有一个 C++ 片段,运行时 for循环,

for(int i = 0; i < I; i++)
  for (int j = 0; j < J; j++)
    A( row(i,j), column(i,j) ) = f(i,j);

片段被重复调用。循环边界“I”和“J”在编译时是已知的(I/J 是 2 到 10 的数量级)。我想以某种方式使用模板展开循环。主要瓶颈是 row() 和 column() 以及 f() 函数。我想用在编译时评估的等效元程序替换它们,使用 row<i,j>::enum技巧。

我真正喜欢的是最终将循环解析为一系列语句,例如:

A(12,37) = 0.5;
A(15,23) = 0.25;
A(14,45) = 0.25;

但我想这样做而不破坏 for - for结构太多。本着以下精神的东西:

TEMPLATE_FOR<i,0,I>
  TEMPLATE_FOR<j,0,J>
     A( row<i,j>::value, column<i,j>::value ) = f<i,j>::value

boost::lambda(或其他东西)可以帮我创建这个吗?

最佳答案

一个好的编译器应该为你做展开。例如,在 gcc 中使用 -O2 选项进行编译会打开循环展开。

如果您尝试自己手动完成,除非您仔细衡量并真正知道自己在做什么,否则您最终可能会得到较慢的代码。例如,在您手动展开的情况下,您可能会阻止编译器进行循环交换或剥离优化(在 the gcc docs 中查找 --floop-interchange 和 -floop-strip-mine )

关于c++ - 在 C++ 中模板化一个 'for' 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1032602/

相关文章:

c++ - cl.exe 在哪里? (MS 构建工具 '13)

c++ - 在临界区、互斥锁和自旋锁之间进行选择

java - 如何在 Windows 上加快 Java 递归文件搜索速度?

mysql - 通过多字段索引查询性能排序 yield

Android ScrollView 与 ListView

C++11 "correct"延迟执行方式

c++ - 如何将任意数量的参数传递给 C++ 模板函数?

c++ - boost::继承模板类的序列化

c++ - 指定模板参数

c++ - 在基于模板的类中重载赋值运算符