C/C++中的自展开宏循环
发布时间:2020-12-16 06:44:32 所属栏目:百科 来源:网络整理
导读:我正在开展一个项目,每个周期都是这样的.在分析我的应用程序时,我发现一些内部循环的开销相当高,因为它们只包含几个机器指令.此外,这些循环中的迭代次数在编译时是已知的. 所以我想,而不是手动展开循环与副本粘贴我可以使用宏在编译时展开循环,以便稍后可以
我正在开展一个项目,每个周期都是这样的.在分析我的应用程序时,我发现一些内部循环的开销相当高,因为它们只包含几个机器指令.此外,这些循环中的迭代次数在编译时是已知的.
所以我想,而不是手动展开循环与副本&粘贴我可以使用宏在编译时展开循环,以便稍后可以轻松修改. 我的形象是这样的: #define LOOP_N_TIMES(N,CODE) <insert magic here> 所以我可以替换(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进行此项目. 解决方法
您可以使用模板来展开.
请参见样品 Live on Godbolt的拆卸 但 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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |