我们都知道编译器会丢弃未使用的变量,如i下面的变量:
int main() {
int a = 10;
int i = 15;
std::cout << a << std::endl;
return 0;
}
我还对编译器是否可以在变量离开作用域之前调用析构函数感兴趣(例如,在它最后一次使用之后)。特别感兴趣的是以下情况:
int foo() {
static std::mutex mutex;
std::lock_guard<std::mutex>{mutex};
... some code ...
return 0;
}
Tobish:在这种情况下,是否有可能在函数退出之前释放互斥锁?
http://eel.is/c++draft/basic.stc.auto#3
当然,这是Abstract C++ Machine的规则,在“as if”规则下可以绕过,但在这种情况下不行。实现很清楚与同步对象的交互会影响程序的观察行为。
编译器可以删除
int a = 10;它不是因为程序中没有对它的调用,而是因为它的存在不会影响程序的行为。这称为假设规则。-a的存在
lock_guard会影响程序的行为,因此 as-if 规则不允许您将其删除。它不能,因为构造函数和析构函数具有编译器无权触及的副作用。
由于锁是在没有名称的情况下创建的,因此它的作用域是当前语句,并且它将一直存在到它的末尾。最有可能的是,编译器仍然无法将其丢弃,但在这种情况下,如果语句中没有任何其他操作,这无关紧要。