CC++中的自展开宏循环

CC++中的自展开宏循环,第1张

概述我正在开展一个项目,每个周期都是这样的.在分析我的应用程序时,我发现一些内部循环的开销相当高,因为它们只包含几个机器指令.此外,这些循环中的迭代次数在编译时是已知的. 所以我想,而不是手动展开循环与副本&粘贴我可以使用宏在编译时展开循环,以便稍后可以轻松修改. 我的形象是这样的: #define LOOP_N_TIMES(N, CODE) <insert magic here> 所以我可以替换(i 我正在开展一个项目,每个周期都是这样的.在分析我的应用程序时,我发现一些内部循环的开销相当高,因为它们只包含几个机器指令.此外,这些循环中的迭代次数在编译时是已知的.

所以我想,而不是手动展开循环与副本&粘贴我可以使用宏在编译时展开循环,以便稍后可以轻松修改.

我的形象是这样的:

#define LOOP_N_TIMES(N,CODE) <insert magic here>

所以我可以替换(int i = 0; i< N,i){do_stuff();用:

#define INNER_LOOP_COUNT 4LOOP_N_TIMES(INNER_LOOP_COUNT,do_stuff();)

它展开自己:

do_stuff(); do_stuff(); do_stuff(); do_stuff();

由于C预处理器在大多数情况下对我来说仍然是一个谜,所以我不知道如何完成这个任务,但是我知道这一点可能是因为Boost似乎有一个BOOST_PP_REPEAT宏.不幸的是,我无法使用Boost进行此项目.

解决方法 您可以使用模板来展开.
请参见样品 Live on Godbolt的拆卸

-funroll-loops has the same effect for this sample.

Live On Coliru

template <unsigned N> struct faux_unroll {    template <typename F> static voID call(F const& f) {        f();        faux_unroll<N-1>::call(f);    }};template <> struct faux_unroll<0u> {    template <typename F> static voID call(F const&) {}};#include <iostream>#include <cstdlib>int main() {    srand(time(0));    double r = 0;    faux_unroll<10>::call([&] { r += 1.0/rand(); });    std::cout << r;}
总结

以上是内存溢出为你收集整理的C/C++中的自展开宏循环全部内容,希望文章能够帮你解决C/C++中的自展开宏循环所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1251216.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存