【发布时间】:2017-09-18 10:31:42
【问题描述】:
所以我正在尝试优化一些代码。我有一个带有可变大小循环的函数。但是,为了提高效率,我想用 1、2 和 3 大小的循环制作完全展开的特殊情况。到目前为止,我的方法是将循环大小声明为 const 参数,然后定义调用主函数的包装函数,并将其传递给 const 值的文字。我已经包含了一个代码片段,它说明了我的想法。
inline void someFunction (const int a)
{
for (int i=0; i<a; i++)
{
// do something with i.
}
}
void specialCase()
{
someFunction (3);
}
void generalCase(int a)
{
someFunction (a);
}
所以我的问题是,我期望我的编译器 (GCC) 在 specialCase 中展开 for 循环是否合理。我的意思是显然我可以复制 - 将 someFunction 的内容粘贴到 specialCase 中并将 a 替换为 3 但为了清楚起见,我宁愿只在代码中处理 someFunction 的一个定义。
【问题讨论】:
-
这里有Godbolt,自己测试一下。
-
您真的会从展开 1、2、3 大小的短循环而不是尝试优化长循环中受益吗?
-
如果您不想复制粘贴,为什么不将
do_something_with(i)设为一个单独的(内联)函数,让编译器为do_something_with(1); do_something_with(2);进行复制粘贴。 -
是的,因为在我的实际示例中,它不仅仅是函数中的一个循环,而是多个循环,其中一些嵌套了 3 或 4 个循环。这个函数会被一遍又一遍地调用,它是程序的主要瓶颈。之前版本的程序手动展开了所有循环,不可读(只支持3次通过该类循环,我想至少支持1、2或3)
-
可悲的是,godbolt 建议循环不会展开。
标签: c++ gcc loop-unrolling