【发布时间】:2015-03-29 16:24:57
【问题描述】:
我目前正在开展一个项目,每个周期都很重要。在分析我的应用程序时,我发现一些内部循环的开销非常高,因为它们只包含一些机器指令。此外,这些循环中的迭代次数在编译时是已知的。
因此,我认为与其通过复制和粘贴手动展开循环,不如使用宏在编译时展开循环,以便以后轻松修改。
我的形象是这样的:
#define LOOP_N_TIMES(N, CODE) <insert magic here>
这样我就可以将for (int i = 0; i < N, ++i) { do_stuff(); } 替换为:
#define INNER_LOOP_COUNT 4
LOOP_N_TIMES(INNER_LOOP_COUNT, do_stuff();)
它会自行展开:
do_stuff(); do_stuff(); do_stuff(); do_stuff();
由于大多数时候 C 预处理器对我来说仍然是一个谜,我不知道如何实现这一点,但我知道这一定是可能的,因为 Boost 似乎有一个 BOOST_PP_REPEAT 宏。不幸的是,我不能在这个项目中使用 Boost。
【问题讨论】:
-
我正在使用 GCC 的修改版本来构建我正在开发的架构。所以我认为技术上是的。
-
你看过-funroll-loops吗?
-
无论我配置它做什么,编译器都不会展开这个循环。旁注:我一直想知道如何将其用于教育目的,而不仅仅是针对这种特定情况。
-
为什么不能为此使用 Boost?如果是出于技术原因(这似乎不太可能),那么我怀疑您是否可以做到这一点。毕竟,如果我理解正确的话,Boost PP 只是标题库。如果没有别的,你应该可以从 Boost 中看看它是如何自己完成的。
-
@user694733:我不能使用 Boost,因为项目不能有任何依赖项。我查看了
BOOST_PP_REPEAT的源代码,它似乎与大多数提议的解决方案大致相同。我希望有一个更通用的解决方案,但我想这是不可能的,因为你不能写递归宏......
标签: c++ c boost macros loop-unrolling