我有一个 for 循环,其中每个步骤 i 处理一个数组元素 p[f(i)],其中 f(i) 是从 1...n 到 1.. 的单射(一对一)映射。 .m(m > n)。因此循环中没有数据耦合,并且可以使用所有编译器优化技术(例如流水线)。但是我如何告知 g++ f(i) 的单射性呢?或者我是否需要(g++ 可以解决这个问题)?
假设
f
不依赖于任何全局状态并且不会产生副作用,您可以使用 const
属性来标记它:
int f(int i) __attribute__((const));
如果
f
确实依赖于全局状态,但仍然具有其输入和全局状态的纯函数的属性(并且不产生副作用),则可以使用稍弱的 pure
属性。
这些属性让 gcc 可以进行比其他方式更多的优化,尽管我不知道这些对您的情况是否有帮助。 查看生成的汇编代码,看看它们是否有帮助。
您还可以尝试使用临时存储数组处理循环,即:
temp[i]= process(p[f(i)]);
然后将结果复制回来:
p[f(i)]= temp[i];
假设您将
p
和 temp
声明为受限指针,编译器有足够的信息来更积极地优化。
如果 f() 的定义在范围内并且是可内联的,那么大多数好的编译器都应该首先将其内联到函数中,那么下一个优化过程应该能够重写代码,就好像函数调用不存在一样。