繁体   English   中英

C ++如何压缩精美的for循环

[英]C++ how to compact fancy for-loops

如果一个人懒得无法在某个变量u上重写一个奇特的循环,则可以定义一个这样的宏:

#define forloop(u) for (int u = 0; u < N; u++)

现在,假设我要这样做

for (int u = 0; u < N; u++) {
    Class& var_u = someFunctionOf(u)
    ... code using var_u ...
}

假设我需要在代码中的多个位置执行此操作,并且我懒得重写它,因为循环涉及多个变量的复杂条件。 如何将其压缩为宏? 我觉得只在宏中放入一个{是令人讨厌的,因为无论您使用的是哪种IDE,它都会破坏语法高亮显示和所有内容。

我实际上只是有一个主意:定义一个模板:

template <typename Loop> void forloop(int u, const Loop& loop) {
    for (int u = 0; u < N; u++) {
        Class& var_u = someFunctionOf(u)
        loop(u, var_u);
    }
}

这样我只需要写:

forloop([&](int u, Class& var_u){
    ... code using var_u ...
});

我知道,我很奇怪。 这是一个好主意吗? 是否所有内容都会在100%的时间内联? 通过这样做而不是常规的for循环,我不会失去任何性能吗? 在我看来,性能至关重要。

我想到的其他方式:

#define forloop(u, var_u) for (int u = 0; u < N; u++) { Class& var_u = someFunctionOf(u)
#define forloop_end }

现在致电:

forloop(u, var_u)
... code using var_u ...
forloop_end

现在,它不是很好,因为{}消失了,所以如果我在循环内使用与循环外之前定义的变量相同的变量名,则IDE语法检查器可能会感到困惑。 所以我想也许有人可以做到这一点:

forloop(u, var_u) {
... code using var_u ...
} forloop_end

但是,{}的额外层是否会降低性能(甚至很小)? 感觉像两个}意味着2轮对象破坏。 这比仅在一个回合中销毁同一组对象要慢吗? 直观地感觉有些堆栈指针将不得不移动两次而不是一次,但是也许编译器足够聪明来优化它?

是的,我关心速度,不希望我的循环慢于常规方式,但是我认为这有助于提高代码的可读性,从而消除代码中每个循环开始时那些令人讨厌的引用初始化。

感谢您的评论和建议。

index_range map_range

for (auto& var_u: map_range(someFunctionOf)( index_range(0,N) ) ){
  ... code using var_u ...
}

通过将map_range(someFunctionOf)存储在共享的某个位置甚至索引范围来进行压缩。

您永远不能保证内联。 如果重要,请编写干净的编译时抽象代码和配置文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM