(有人可能会指出这是this question的重复,但这个问题的特定部分并没有完全得到回答。因此,我决定提出一个新问题,只涉及这个问题。)
(我不是C++专家,所以以下陈述可能不正确,但我还是尝试一下)。 C++编译器可能会优化掉它将永远不执行或永远不退出的代码部分(例如循环)。以下是一个例子:
void test() {
bool escape = false;
while ( !escape ); // Will never be exited
// Do something useful after having escaped
}
编译器很可能会认为由于代码从未更改
escape
的值,因此循环永远不会退出。这使得循环变得无用。现在,如果我们将变量更改为指针,编译器是否仍会优化掉循环?假设代码如下:
void test( bool* escape ) {
while ( *escape ); // Will this be executed?
// Do something useful after having escaped
}
我的猜测是编译器将取消循环,否则关键字volatile将是多余的,对吗?但是在使用线程时怎么办——它实际上被修改了,但是在函数之外,甚至可能完全在C++文件之外——编译器仍然会删除循环吗?如果由escape指向的变量是全局变量或另一个函数内部的局部变量,是否有区别?编译器能检测到这一点吗?在this question中,有些人说如果在循环内调用库函数,编译器将不会优化循环。那么在使用库函数时有哪些机制可以防止此优化?