问:
// 方法 A:
Widget w;
for (int i = 0; i < n; ++i) {
w = 取决于 i 的某个值;
}
// 方法 B:
for (int i = 0; i < n; ++i) {
Widget w(取决于 i 的某个值);
}
Effective C++ 条款 26 有一段话大概是:当一个赋值成本低于一组构造+析构成本,定义在循环外(即A)比较高效,否则定义在循环内(即B)比较好。
我的问题是:哪些情况 赋值成本低于一组构造+析构成本?
答:
我觉得这个更应该思考两种情况下,变量的作用域,这个更为关键。A情况,w的生存周期会在循环外继续存在,而B不会,不要过早的考虑优化的问题,现在的编译器比你想象的还要聪明。
而对于C++来说,更崇尚RAII(Resource Acquisition Is Initialization),当你要使用时,就直接再声明定义。比如在A情况下,如果我在赋值w前有一段是检测逻辑,如果不满足,我就直接抛出异常,那么你就需要承担构造w的代价,即使它没有用到,如下所示:
Widget w;
for (int i = 0; i < n; ++i) {
if(some condition)
{
throw std::exception("haha");
}
w = 取决于 i 的某个值;
}
然而,对于在使用时再直接声明并定义就不会有这样的问题:
for (int i = 0; i < n; ++i) {
if(some condition)
{
throw std::exception("haha");
}
Widget w(i);
}
这样,即使抛出异常,也不会承担构造无谓的构造w的代码。
所以,在编写C++代码时,应该忘记C89的先声明,后面再来定义的做法,而是考虑RAII。
原文链接:循环内还是循环外定义变量? - 蓝色的回答 - 知乎 https://www.zhihu.com/question/36125544/answer/66031885