我想這主要是關於打破C/C++優化器。C/C++標籤數量(goto)如何影響性能?
l_line1:
do_stuff(a, b);
l_line2:
do_other_stuff(n, m, o);
l_line3:
do_more_stuff(x);
是否有性能差異,如果標籤是一個if
塊內,如果這是不正確的運行?
if (debug_active) {
l_line1:
nextline = debugme(d1, d2, d3);
goto nextline_check;
}
do_stuff(a, b);
if (debug_active) {
l_line2:
nextline = debugme(d1, d2, d3);
goto nextline_check;
}
do_other_stuff(n, m, o);
if (debug_active) {
l_line3:
nextline = debugme(d1, d2, d3);
goto nextline_check;
}
do_more_stuff(x);
return;
nextline_check:
switch (nextline) {
case 1: goto l_line1;
case 2: goto l_line2;
case 3: goto l_line3;
default: DEB_ASSERT("Wrong line");
}
背景: 這些線插入用於源級調試器。 所有這些goto
的原因是因爲代碼生成(「原始」代碼 - 從另一種語言翻譯到C/C++ - 這是第一個沒有標籤的樣本,第二個是或多或少的調試選項產生什麼)。 如果您希望能夠在調試過程中跳過行或者甚至更改下一條語句(兩者都將在函數debugme
期間由「用戶」設置),那麼您需要在每個語句之前標記標籤,並且goto
這些標籤取決於返回(在這種情況簡化爲返回碼)。
一般想法,讓一個可移植的代碼有更好的表現會不錯,太(非便攜的建議將是很好也知道, - 至少對於GCC和MSC)。
請告訴我你爲什麼使用'goto'? –
好神,那個代碼基本上是「Goto認爲有害」的* manifest *。 –
@NicolBolas你是什麼意思?他說他正在生成這個代碼。此外,沒有冒犯,但我認爲這個「Goto認爲有害」的東西是有害的;) – dercz