对于基元类型和 POD 类型,它没有区别。编译器将在函数的开头为变量分配堆栈空间,并在两种情况下函数都返回时释放它。
对于具有非平凡构造函数的非 POD 类型来说,这将产生不同的结果——在这种情况下,将变量置于循环之外只会调用构造函数和析构函数一次,并且每次迭代都会调用赋值操作符,而将其置于循环内则会在循环的每次迭代中调用构造函数和析构函数。取决于类的构造函数、析构函数和赋值操作符所做的事情,这可能是可取的,也可能不是可取的。
while (i< 100) {
LockMgr lock( myCriticalSection); // acquires a critical section at start of
// each loop iteration
// do stuff...
} // critical section is released at end of each loop iteration
与下列情况完全不同:
LockMgr lock( myCriticalSection);
while (i< 100) {
// do stuff...
}