尽可能延后变量定义式的出现时间

定义一个带有构造函数和析构函数类型的变量,当程序执行到变量的定义式时,构造函数便会被执行,当变量离开作用域时,析构函数便会被执行。即使这个变量从未被使用,比如如下代码:

std::string encrypt_password(const std::string& password) {
    std::string encrypted;
    if (password.size() < min_size) {
        throw logic_error("password is too short");
    }
    ...
    return encrypted;
}

该函数用来加密密码,前提是密码达到一定长度,当密码过短则抛出异常。然而,上述代码过早定义变量 encrypted,当密码过短时,仍然执行了string类的构造函数和析构函数,产生了不必要的成本。为避免不必要的构造和析构成本,函数可实现如下:

std::string encrypt_password(const std::string& password) {
    if (password.size() < min_size) {
        throw logic_error("password is too short");
    }
    std:: string encrypted(password);
    ...
    return encrypted;
}

”但循环怎么办?“,当变量只在循环内使用时,应该将变量定义在循环外还是定义在循环内呢?

情况A:

Widget w;
for (int i=0; i<n; ++i) {
    w = 取决于i的值;
}

情况B:

for (int i=0; i<n; ++i) {
    Widget w(取决于i的值);
}

情况 A 的成本为:1次构造函数 + n 次赋值操作 + 1 次析构函数
情况 B 的成本为:n 次构造函数 + n 次析构函数

当一个赋值操作成本低于一组构造成本 + 析构成本,情况 A 的成本低于情况 B 。情况 B 的 w 作用域限制在循环内,情况 A 不利于对程序时的可理解性和易维护性。因此除非:(1)明确一个赋值操作成本低于一组构造成本 + 析构成本;(2)正在处理效率高度敏感的代码。 否则使用情况 B。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值