Mã Tôi có trông như thế này (tất cả sử dụng của xong hiển thị):Trình biên dịch có tối ưu hóa thoát khỏi vòng lặp bên trong không?
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;
...
}
sẽ bất kỳ trình biên dịch chuyển nó sang này:
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:;
Lưu ý: Trong khi tôi chủ yếu quan tâm nếu số if(done)break;
bị bỏ qua và bị xóa dưới dạng mã chết, tôi cũng quan tâm đến việc nó và done
sẽ bị xóa hoàn toàn.
Nhân tiện, bạn không nên xác định bất kỳ biểu tượng nào bắt đầu bằng hai dấu gạch dưới như thế; các ký hiệu như vậy được bảo lưu. –
Biểu tượng sẽ là kết quả của một thẻ tối ưu hóa, e.i. được tạo bởi trình biên dịch. Tôi đã sử dụng tên đó * vì * nó chỉ ra một tên được đặt trước/bên trong. – BCS
Và câu hỏi: tại sao nó không bị giấu trong một chức năng?Bạn có thể sử dụng 'return' rồi;) –