C/C++ 循环内还是循环外定义变量更好?

问:

// 方法 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值