我用宏的代碼展開的循環是這樣的:(愚蠢的例子)C++循環宏
#define foreach_small_prime(p, instr) { \
int p; \
p = 2; instr; \
p = 3; instr; \
p = 5; instr; \
p = 7; instr; \
}
foreach_small_prime(pp, cout << pp);
int sum = 0;
foreach_small_prime(pp, {
sum += pp;
if (sum >= 10) cout << sum << endl;
});
但在某些情況下,我可能會使用的結構:
#define foreach_small_even(ii) for(int ii = 0; ii < 20; ii += 2)
int sum = 0;
foreach_small_even(pp) {
sum += pp;
if (sum >= 10) cout << sum << endl;
}
我喜歡這個宏,因爲我可以通過一個變量作爲參數名稱。
問題:有沒有像第二個宏那樣的像第一個宏那樣定義循環的方法?
快速問題,你發現這個展開實際上提高了性能?如果你沒有通過配置來證明它確實如此。你應該考慮編寫「明顯」的方式,讓編譯器對你很聰明。 – user83255 2009-05-06 14:08:23
停止濫用宏觀系統。正是由於這樣的濫用,函數內聯纔是C++的一個必需特性。 – 2009-05-06 14:39:46
事實上,我做了一個非常詳細的分析,包括各種g ++選項的asm輸出分析。性能差異很大,主要是由於循環中的條件分支。 – 2009-05-06 15:13:35