【发布时间】:2013-03-07 15:27:00
【问题描述】:
有没有办法告诉 clang 展开特定循环?
在谷歌上搜索答案会给我命令行选项,这些选项会影响整个编译器,而不是单个循环。
GCC 有一个类似的问题 --- Tell gcc to specifically unroll a loop --- 但那里提供的答案不适用于 clang。
那里建议的选项 1:
#pragma GCC optimize ("unroll-loops")
似乎被默默地忽略了。其实
#pragma GCC akjhdfkjahsdkjfhskdfhd
也会被默默忽略。
选项 2:
__attribute__((optimize("unroll-loops")))
导致警告:
warning: unknown attribute 'optimize' ignored [-Wattributes]
更新
joshuanapoli 提供了一个很好的解决方案,如何在不创建循环的情况下通过模板元编程和 C++11 进行迭代。该构造将在编译时解析,从而导致重复内联的主体。虽然它不完全是问题的答案,但它基本上实现了相同的目标。
这就是我接受答案的原因。但是,如果您碰巧知道如何使用标准 C 循环(for、while)并强制展开它 - 请与我们分享知识!
【问题讨论】:
-
通常情况下,编译器非常清楚何时适合展开循环以及何时不适合。您试图解决哪些不适用的特殊情况?
-
它可能不会强制展开,但
__attribute__ ((hot))可能值得一试。 -
@MatsPetersson 我想明确衡量循环展开的好处。手写的unroll其实把代码提速了3倍,但是编译器没有搞清楚。