首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用内射函数索引数组时优化g++

使用内射函数索引数组时优化g++
EN

Stack Overflow用户
提问于 2010-10-15 05:40:06
回答 3查看 249关注 0票数 2

我有一个for循环,其中每个步骤i,它处理一个数组元素pf(i),其中f(i)是从1...n到1...m (m > n)的内射(一对一)映射。因此,在循环中没有数据耦合,并且可以使用所有的编译器优化技术,如流水线。但是我怎么才能告诉g++ f(i)的内射性呢?或者我甚至需要这样做( g++能搞清楚这一点吗)?

EN

回答 3

Stack Overflow用户

发布于 2010-10-15 05:47:41

假设f不依赖于任何全局状态,并且不产生任何副作用,您可以用const attribute对其进行标记

代码语言:javascript
代码运行次数:0
运行
复制
int f(int i) __attribute__((const));

如果f确实依赖于全局状态,但仍然具有它是输入和全局状态的纯函数的属性(并且不会产生任何副作用),您可以使用稍弱的pure attribute

这些属性让gcc进行了比其他方式更多的优化,尽管我不知道这些属性对您的情况是否有帮助。看一下生成的汇编代码,看看它们是否有帮助。

票数 6
EN

Stack Overflow用户

发布于 2010-10-15 06:27:14

您还可以尝试使用临时存储阵列处理循环,例如:

代码语言:javascript
代码运行次数:0
运行
复制
temp[i]= process(p[f(i)]);

然后将结果复制回来:

代码语言:javascript
代码运行次数:0
运行
复制
p[f(i)]= temp[i];

假设您将ptemp声明为受限指针,编译器就有足够的信息来更积极地进行优化。

票数 0
EN

Stack Overflow用户

发布于 2010-10-15 07:58:21

如果f()的定义在作用域中并且是可内联的,那么几乎任何好的编译器都应该首先将其内联到函数中,那么下一次优化应该能够重写代码,就好像函数调用不在那里一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3937806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档