当前位置: 首页 > news >正文

Effective C++ 条款26

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

我们知道定义一个对象的时候有一个不争的事实,那就是分配内存。假设是我们自己定义的对象。程序运行过程中会调用类的构造函数和析构函数。

我们打个例如,假设天下雨了,你带把雨伞肯定是值得的。

但是,假设你带伞了,今天却没下雨,你是不是感觉自己亏了?的确,亏在了带了却没用,所以伞就变成了累赘。

本节的关键就在于此,假设你定义一个变量或者对象没有被使用,那么就是不完美的代码。
我们看一个代码片段:

std::string encryptPassword(const std::string& psaaword)
{
    using namespace std;
    string encrypted;
    if(password.length()<MinimumPasswordLength)
    {
        throw logic_error("Password is too short");
    }
    ……//加密密码,把加密结果放到encrypted内
    return encrypted;
}

假设,抛出异常,上面的变量encrypted就没有被使用,虽未被使用,但是却要承受一次构造和一次析构的行为。

改进例如以下:

std::string encryptPassword(const std::string& psaaword) 
{ 
using namespace std;

    if(password.length()<MinimumPasswordLength)
    {
        throw logic_error("Password is too short");
    }
    string encrypted;
    ……//加密密码,把加密结果放到encrypted内
    return encrypted;
    }

改进的代码跳过了异常。保证定义的encrypted一定被使用。但是我们知道假设可以调用copy构造函数,就没有必要调用default构造函数+赋值运算符函数。由于前者更高效。
我们继续改进代码:

    std::string encryptPassword(const std::string& psaaword)
    {
        using namespace std;
        if(password.length()<MinimumPasswordLength)
        {
            throw logic_error("Password is too short");
        }
        string encrypted(password);//定义+赋值
        encrypt(encrpted);
        ……//加密密码,把加密结果放到encrypted内
        return encrypted;
    }

那么我们在循环中怎么贯彻这样的思想呢?
对照一下代码:

Widget w;//定义在循环外
for(int i=0;i < n;++i)
    w=……;
    ……
}

for(int i=0;i<n;++i){
    Widget w(……);//定义并赋值
    ……
}

第一个调用了1个构造函数+1个析构函数+n个赋值操作。第二个调用了n个构造函数+n个析构函数。我们此时须要斟酌一下是赋值操作的效率高还是构造+析构的效率高。其实,假设两方差距不大。最好选用后者,由于后者对象的作用域更小,可维护性和可理解性更强。更安全。

相关文章:

  • 文件上传利器JQuery上传插件Uploadify
  • Ubuntu菜鸟入门(六)—— 有道词典安装
  • jQuery.form开发手记
  • EF只更新变化的字段
  • OC内存管理
  • MySQL入门(二)
  • 助力合作伙伴引领“互联网+”变革 浪潮预发布高端存储
  • 七:zooKeeper开源客户端ZkClient的api测试
  • 定时任务crontab在书写时的四大坑
  • YUM仓库的部署
  • Laravel 中的一个后期静态绑定
  • 简单使用JSTL攻略
  • Powershell 编写和运行脚本
  • windos 下端口被占用
  • git与eclipse相关
  • [PHP内核探索]PHP中的哈希表
  • Android系统模拟器绘制实现概述
  • AngularJS指令开发(1)——参数详解
  • C++11: atomic 头文件
  • E-HPC支持多队列管理和自动伸缩
  • js中forEach回调同异步问题
  • node入门
  • PhantomJS 安装
  • Redux 中间件分析
  • SAP云平台里Global Account和Sub Account的关系
  • 百度地图API标注+时间轴组件
  • 翻译--Thinking in React
  • 如何用vue打造一个移动端音乐播放器
  • 深入浏览器事件循环的本质
  • 一些css基础学习笔记
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​【已解决】npm install​卡主不动的情况
  • #if 1...#endif
  • #include
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (差分)胡桃爱原石
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)WLAN定义和基本架构转
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .bashrc在哪里,alias妙用
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net wcf memory gates checking failed
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • [ JavaScript ] JSON方法
  • [@Controller]4 详解@ModelAttribute
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [bzoj1324]Exca王者之剑_最小割
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • [javaSE] GUI(Action事件)