我正在进行一些研究并遇到this article,它很好地描述了restrict
关键字,我认为我对其有效用法有了很好的把握。引用文章对restrict
:
C99的新功能:限制类型限定符允许编写程序,以便翻译人员可以生成明显更快的可执行文件。 [...]任何对此不感兴趣的人都可以放心地忽略该语言的这一特性。 - 从国际标准的基本原理 - 编程语言 - C [std.dkuug.dk](6.7.3.1限制的正式定义)
在我的情况下,这恰好是真的;我正在编写嵌入式代码,这可能有利于更高性能的编译代码,而且我对组装使用它以获得帮助感到不舒服。所以我正在考虑在适当的地方使用restrict
。具体来说,我有几个函数循环并获取相同类型的指针参数,所以看起来我的代码可以从表面上受益。
然而,文章指出:
你应该期望使用restrict关键字声明所有别名信息的代码几乎总是比使用不受限制的指针更好地执行,并且永远不会更糟。在超标量RISC或具有大型寄存器文件的RISC类架构(如PowerPC或MIPS R4000)中尤其如此。
我正在使用带有GCC工具链的ARM Cortex-M4。我对各种处理器架构没有足够的了解来比较large register files
与我的用例的含义,但考虑到给出的示例处理器和快速Google搜索,我很确定我没有'构成该列表,尽管应用程序类可能是ARM处理器。
因此,考虑到这一切,我是否会看到超越微优化的好处?我完全希望以某种方式对其进行分析,但我想知道restrict
在ARM Cortex-M4 / GCC环境中的定性影响,特别是,如果它的管道可以利用这些变化或如果还有一些其他因素会阻止一个主要的好处,例如无法安排内存访问。
答案 0 :(得分:0)
Restrict
关键字允许编译器删除程序中某些内存操作之间的依赖关系。这为大量优化打开了机会,例如更严格的指令计划(这反过来又可以从循环展开中获得更大的收益),自动向量化或将多个标量加载/存储结合到向量化的变体中(对于ARM,则为ldm
/ stm
)。
上层无序的体系结构(例如在ARM的情况下为Cortex-A)会通过动态分析和重新排序指令流(甚至在那里)来尽力(并花费大量精力)在运行时执行这些优化。 restrict
可以启用更高级别的优化(例如自动矢量化)。诸如M4之类的低端嵌入式内核缺乏这种功能,因此restrict
批注对于在那里的性能至关重要。
正如其他评论者所指出的那样,restrict
的语义并不完全是琐碎的,因此我建议仅在热循环中使用它。