【发布时间】:2011-03-04 06:27:46
【问题描述】:
我的代码看起来像这样(显示了 done 的所有用法):
bool done = false;
for(int i = 0; i < big; i++)
{
...
for(int j = 0; j < wow; j++)
{
...
if(foo(i,j))
{
done = true;
break;
}
...
}
if(done) break;
...
}
任何编译器都会把它转换成这个:
for(int i = 0; i < big; i++)
{
...
for(int j = 0; j < wow; j++)
{
...
if(foo(i,j))
goto __done; // same as a labeled break if we had it
...
}
...
}
__done:;
注意:虽然我最感兴趣的是 if(done)break; 是否被绕过并作为死代码删除,但我也对它和 done 是否被完全删除感兴趣。 p>
【问题讨论】:
-
顺便说一句,你不应该定义任何以两个下划线开头的符号;此类符号是保留的。
-
该符号将是优化过程的结果,例如由编译器生成。我使用该名称因为它表示保留/内部名称。
-
还有一个问题:为什么不把它隐藏在一个函数中?然后你可以使用
return;) -
带标签的 break 在 C/C++ 中称为 GOTO 语句,适合您的情况,除非您想将代码分解为单独的函数。
-
@fabspro:为了这个问题,假设禁止使用
goto(例如某些PHB)。将循环放在另一个函数中也是如此。
标签: c++ optimization compiler-construction