簡體   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