我正在做一些研究,发现this article很好地描述了restrict
关键字,因此,我对它的有效用法有了相当的了解。要引用restrict
定义的文章引用:
C99的一项新功能:限制类型限定符允许编写程序,以便翻译器可以更快地生成可执行文件。 [...]不需要担心的任何人都可以安全地忽略该语言的功能。
-从国际标准的原理-编程语言-C [std.dkuug.dk](6.7.3.1限制的形式定义)
就我而言,这确实是事实。我正在编写嵌入式代码,可能会受益于更高性能的编译代码,而我对汇编不太满意,无法利用它来寻求帮助。因此,我正在考虑在适当的地方使用restrict
。具体来说,我有几个函数可以循环并使用相同类型的指针参数,因此看起来我的代码可以从表面上受益。
但是,该文章指出:
您应该期望使用限制关键字声明所有别名信息的代码几乎总是比使用非限制指针表现得更好,并且永远不会更差。在超标量RISC或具有大寄存器文件的类似RISC的体系结构(例如PowerPC或MIPS R4000)上尤其如此。
我正在使用带有GCC工具链的ARM Cortex-M4。我对各种处理器架构没有足够的了解,无法将large register files
的含义与我的用例进行比较,但是鉴于给出的示例处理器和快速的Google搜索,我很确定我不会构成该列表,尽管也许应用类将是ARM处理器。
因此,考虑到所有这些,我是否会看到微优化之外的好处?我完全希望以一种或另一种方法来分析它,但是我想知道restrict
在ARM Cortex-M4 / GCC的上下文中的定性影响,特别是它的管道可以利用这些更改还是存在某些变化?妨碍主要利益的其他因素,例如无法安排内存访问。
最佳答案
Restrict
关键字允许编译器删除程序中某些内存操作之间的依赖关系。这为大量优化打开了机遇,例如更严格的指令调度(这反过来可以从循环展开中获得更大的收益),自动向量化或将多个标量加载/存储组合到向量化的变体中(对于ARM,为ldm
/ stm
)。
上层无序的体系结构(例如在ARM的情况下为Cortex-A)通过动态分析和重新排序指令流(即使在其中restrict
可能启用),也非常努力(并花费大量精力)在运行时执行这些优化。更高级别的优化(例如自动矢量化)。诸如M4之类的低端嵌入式内核缺乏此类功能,因此restrict
批注对于那里的性能绝对至关重要。
正如其他评论者所指出的,restrict
的语义并不完全是琐碎的,因此我建议仅在热循环中使用它。
关于c - 在ARM中使用'restrict'关键字会改善我的代码吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26442620/