Effective C++读书笔记之尽量延后变量定义式的出现时间

《Effective C++》 读书笔记(详细总结55条款)上篇 下面从四个方面来说 (1) C++ 以 C 为基础,很多语句语法都没有改变,只是进行了扩展,C++ 解决问题的时候,可以理解为 C 的高效解法 (2) 面向对象,有构造函数,析构函数,继承、封装、多态、虚函数动态绑定,这是不同于C 语言的部分 (3) 泛型编程、可以理解为代码的模型,但是代码本身并不占用内存空间,只有在实例化的时候,才分配内存,所以可以提高代码复用性 阅读详情

      只要你定义了一个变量而其类型带有一个构造函数和析构函数,你就要承受构造和析构成本。有时这个变量最终并未被使用,这就是一种浪费了。你可能会说我不可能定义一个不使用的变量。哈哈  看看下面的代码例子,有时这种不使用不是由你故意造成的。
 有一个计算通行密码的加密版本而后返回,前提是密码够长,否则函数会抛出一个异常。如下:
 //这个函数过早定义变量"encrypted"
 std::string encryptPassword(const std::string& password)
 {
  using namespace std;
  string encrypted;
  if(password.length() < MinimunPasswordLength)
  { throw logic_err("Password is Too Short"); }
  .....        //必要的动作,能将一个加密后的密码置入变量encrypted内
  return encrypted;
 }
 问题出在如果代码抛出异常,则encrypted没有完全的被使用,可是你还是会付出构造和析构成本。所以最好是延后变量的定义式,直到确实需要它。如下:
 //延后了encrypted的定义式
 std::string encryptPassword(const std::string& password)
 {
  using namespace std;
  if(password.length() < MinimunPasswordLength)
  { throw logic_err("Password is Too Short"); }
  string encrypted;   //延后定义了
  .....        //必要的动作,能将一个加密后的密码置入变量encrypted内
  return encrypted;
 }
 上面的代码还是有问题,就是在encrypted定义时使用了default构造函数,因为encrypted虽然获定义却无任何实参作为初值,这样下面你还要给它赋初值。这就是一种浪费了。更受欢迎的做法是以password作为encrypted的初值,跳过毫无意义的default构造函数,如下:
 //这是定义初始化encrypted最佳的方法
 std::string encryptPassword(const std::string& password)
 {
  .....                         //和前面一样
  string encrypted(password);   //使用了copy构造函数定义并初始化
  .....                         //必要的动作,能将一个加密后的密码置入变量encrypted内
  return encrypted;
 }
 本条款“尽可能延后“的真正意义:不只应该延后变量的定义,直到非使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初值实参为止。这样不仅能够避免构造和析构非必要对象,还可以避免无意义的default构造行为。
 总结:
 尽可能延后变量定义式的出现,这样做可增加程序的清晰度并改善程序效率 

《Effective C++》读书笔记——第一章:Accustoming Yourself to C++ 大年三十却不能回家,也不能找????玩,我恨死这个新型冠状病毒了 既然只能宅在家,那就充分利用一下这段时间多学习一点吧 言归正传,本章主要是在讲如何让自己适应C++,当然这也是全书所想要表达的,只是这一章着重讲一些基础 Item 1: VIEW C++ AS A FEDERATION OF LANGUAGES 特意去查了一下federation是什么意思,好像大概是说联盟、联邦之类的,所以这条item... 阅读详情

相关推荐

读书笔记:《Effective Modern C++(C++14)》

使用RAII(“Resource Acquisition Is Initialization,资源获得即初始化)包装thread,在析构时进行join。和闭包类存在于编译期,闭包存在于运行时。

每一个不曾起舞的日子,都是对人生的辜负。 1946

读书笔记《Effective C++》条款26:尽可能延后变量定义式的出现时间

只要定义了一个变量而其类型带有一个构造函数或析构函数,那么当code flow到达这个变量定义式时,便得承受构造成本;当这个变量离开作用域时,便得承受析构成本。即使这个变量始终并未被使用,仍需耗费这些成本,所以应该尽可能避免这种情形。 或许会认为,不可能定义一个不使用的变量,但是比如下使用变量前,有一个异常被抛出,那这个变量就真的没有被使用,同时还得付出构造成本和析构成本。所以最好延后定义,直到

Do-Program的专栏 279

[附源码]计算机毕业设计JAVA网上花店系统

附源码]计算机毕业设计JAVA网上花店系统项目运行环境配置:(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat。

ssm毕设程序设计 2444

Effective C++读书笔记---尽可能延后变量定义式出现的时间

如果定义了一个带有构造函数和析构函数的变量,那么程序就要承受构造和析构的成本----你必须考虑这件事情 考虑以下函数: std::string encryptPassword(const std::string& password) { using namespace std; string encrypted; if(password.length() < MiniL

PENGH56的专栏 482

ALSA音频开发实战:如何用snd_pcm_avail避免缓冲区溢出(附完整代码)

本文深入探讨了在ALSA音频开发中,如何利用`snd_pcm_avail`函数有效管理环形缓冲区,从而避免音频数据溢出或下溢。通过实战代码示例,详细解析了该函数在播放场景下的核心作用,即实时查询可写入的帧数,并构建了自适应写入循环以实现稳健的流量控制,确保音频流的平滑与稳定。

weixin_29183637的博客 461

农业杂草检测——甜菜杂草目标检测数据集

甜菜田中常见的杂草种类繁多,主要有稗草、狗尾草、芦苇、灰藜等。•稗草:一年生草本植物,和稻子外形极为相似。秆直立,光滑无毛。圆锥花序主轴具角棱,粗糙;小穗密集于穗轴的一侧,具极短柄或近无柄。花果期 7 - 10月。生长在稻田里、沼泽、沟渠旁、低洼荒地等。•狗尾草:又叫莠,因穗形像狗尾巴而得名。秆疏丛生,直立或基部膝曲上升。叶片条状披针形,叶鞘松弛,光滑,鞘口有毛;叶舌毛状。圆锥花序呈圆柱状,直立或稍弯垂,刚毛绿色或变紫色。夏、秋采收,晒干。常生长在麦田、谷子、玉米、棉花、豆类、花生、薯类、蔬菜、甜菜、马铃薯

qq_38220914的博客 1139

《Effective C++》读书笔记之item26:尽可能延后变量定义式的出现时间

1.自定义变量(类)初始化时会调用构造函数,作用域结束后会调用析构函数,而当变量定义后却由于某种原因(异常或条件判断)而没有使用,便造成了资源浪费。因此,应当尽可能延后变量的定义,甚至应该延后直到给它初值实参为止,以防止无意义的“调用默认构造函数后再赋值”的过程。 2.P115页有两个循环过程的比较: //方法A:定义于循环外 Widget w; for(int i = 0;i<n;+

banguijun的专栏 639

ABtest描述统计功效

我们在面试数据分析时,常常会问到如何确定样本量的问题,会有一个指标:统计功效(power),或者是1-β 统计功效会影响实验的可信度,甚至会影响实验所需的样本量,要了解统计功效,首先要理解两类统计错误 假如我们做了一个AB实验,且两组用户的数据均值为μ1和μ2,我们会有两个初始假设: H0:两个实验组的数据没有差别(μ1=μ2),这个假设也叫“零假设”,也叫原假设 H1:两个实验组之间的数据存在差别(μ1≠μ2),这个假设也叫“非零假设”,也叫备择假设 定义两类错误: 实验本身没有效应,但我们觉

qq_38134556的博客 898

Effective C++条款26:尽可能延后变量定义式的出现时间.

考虑下面函数: std::string encryptPassword(const std::string & password) { using namespace std; string encrypted; if(password.length() < MinimumPasswordLength) { throw logic_error("Password is t...

qq_44800780的博客 404

FPGA实现电机转速PID控制

通过纯RTL实现电机转速PID控制,包括电机编码器值读取,电机速度、正反转控制,PID算法,卡尔曼滤波,最终实现对电机速度进行控制,使其能够渐近设定的编码器目标值。

STATEABC的博客 7488

Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法

Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法 目录 Unity AssetBundle 之 (入门)简单的资源打包成AB包的方法 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、实现步骤 六、关键代码 一、简单介绍 Unity中的一些基础知识点。 本节介绍,Asset Bundle 在 Unity中的使用,入门第一篇,如何AssetBundle标记,如何打包成AssetBundle的操作方法,有不对的地方欢迎指正。...

仙魁XAN 1万+

读书笔记_Effective C++_习惯C++

这是一本非常经典C++书籍,也是我在工作中发现自己C++上还有很多薄弱点的时候经常拿来充电的。这本书内容很多,讲了很多如何高效地使用C++的方法,有些地方自己也没能啃透,读过一遍后很多知识点容易忘记,这次是一条一条地进行温习,之所以会分享出来是觉得对于程序员来说,好记性不如烂笔头,自己多动手往往在真正写程序的时候能够像条件反射一样写出好的代码。慢工出细活,对待技术要有谨慎和敬畏之心。这本书推荐喜欢C

John_cdy的专栏 3194

Mamba SSM 实战:IMDb 文本分类 + Mamba-ssm 全流程

Mamba SSM 文本分类链路:IMDb 二分类 → MambaLMHeadModel (d_model=256, n_layer=8, d_state=16, exp2=2) → 末 token 分类头。5 epoch 达 89.2% 准确率 (与 BERT-base 持平), 但显存降低 44% (3.5GB vs 6.2GB)。建议序列长度 ≥ 1024 再选 Mamba, 短序列 (< 512) 用 BERT 更高效。扩展时注意d_state。

m0_71589036的博客 57

Effective C++ | 读书笔记 (三)

提前定义变量,有可能导致变量并没有使用(如中间抛异常了),而平白多了一个构造和析构成本。但是循环怎么办?// 方式AWidget w;i < n;...// 方式Bi < n;++i) {...做法A:1个构造 + 1个析构 + n个赋值操作做法B:n个构造函数 + n个析构函数打破本条款选择A的依据:(1)你知道赋值成本比“构造+析构"成本低。(2)你正在处理代码中效率高度敏感的部分。否则你应该使用做法B,维持变量尽可能在使用时定义的原则。请记住。

m0_74795952的博客 945

微信小程序 - 实现身份证OCR识别人像面与国徽面并提取字段信息,详解从手机相册选取或打开摄像头拍照上传身份证正反面图片ocr文字识别数据填充表单(提供免费纯前端ocr识别插件+百度OCR识别API)

微信小程序身份证识别,微信小程序身份证拍照、上传并OCR识别,微信小程序实现OCR扫描识别,微信小程序识别身份证免费插件,微信小程序实现身份证识别功能。ocr识别插件。微信身份证拍照后进行ocr识别,微信小程序OCR扫描识别身份证,OCR身份证实名认证+图片上传+拍照上传图片,微信小程序之身份证照片正反上传,小程序OCR身份证识别,微信小程序实现文字识别-ocr插件,微信小程序利用百度AI实现扫描身份证获取信息功能,基于微信小程序OCR插件实现身份证拍照、上传并OCR识别的示例demo,将上传的照片传到服务

🏆 前端领域优质创作者 8133

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《Effective C++》读书笔记

Effective C++Scott Meyers 屋檐下的水滴--读书笔记系列http://blog.youkuaiyun.com/dwater 导读 Introduction1.   所谓declaration,是用来将一个object、function、class或template的类型告诉编译器,它不带细节信息。所谓definition,是用来将细节信息提供给编译器。对

DWATER 3167

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Effective cpp 读书笔记6

26.尽可能延后变量定义时的出现时间 27.尽量少做转型动作 28.避免返回handles指向对象内部成分 29.为“异常安全”而努力使值得的 30.透彻了解“inlining”的里里外外 31.将文件间的编译依存关系降至最低

GZGlenn的博客 438

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

《Effective C++》读书笔记(二)

《Effective C++》读书笔记 条款26:尽可能延后变量定义式的出现时间 尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序效率。 条款27:尽量少做转型动作 如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts。如果有个设计需要转型动作,试着发展无需转型的替代设计。 如果转型是必要的,试着将它隐藏于某个函数背后。客户随后可以调用该函数,而不需要将转型放进他们自己的代码内。 尽量使用C+±style转型,不要使用旧式转型。前者很容易辨识出来,而且也比较有

WINGREZ‘S BLOG 427

Effective C++ | 读书笔记 (一)

这意味着,如果你在一个编译单元中依赖于另一个编译单元中的全局静态对象的初始化结果,你的程序可能会遇到未定义行为,因为那些对象的初始化次序是不确定的。在构造、析构函数中一定只会调用本类中的虚函数。原因:当基类指针(引用)指向子类对象时,如果析构对象通过delete 指针的方式,只会调用基类的析构函数,不会调用子类的析构函数。如果把这个当做是基类,会有问题,析构函数只有声明没有定义,析构函数从派生类到基类的调用时,会发生链接错误。时,先调用基类的构造函数,此时派生类还没有被构造出来,所以调用的是基类的虚函数。

m0_74795952的博客 1042

《Effective C++》 读书笔记(详细总结55条款)下篇

Effective C++ 目录五、实现26、尽可能延后变量定义的时间27、尽量少做转型动作28、避免返回 Handles 指向对象内部成分29、为异常安全努力是值得的30、透彻理解 inlining 里里外外31、将文件间的编译依存关系降到最低六、继承与面向对象设计32、确定你的 public 继承塑模出is-a的关系33、避免遮掩继承而来的名称34、区分接口继承和实现继承35、考虑 virtual 函数以外的其他选择36、绝不重新定义继承而来的 non-virtual 函数七、模板与泛型编程八、定制

身在边城 心在编程 870

Effective C++读书笔记(上)

Effective C++读书笔记(一到三章)

still_wtm的博客 748

effective C++ 读书笔记

effective C++ 读书笔记 听说这是一本好书,于是就读了,确实不错。十年以后我再读这本书,应该会有更深的体会。

weixin_58414907的博客 475

Effective C++_读书笔记

设计与声明。

Mr.Andy的博客 1460

Effective C++ | 读书笔记 (四)

对应条款24,这里只是模版实现。规则一致,但它们写法上有所区别了。public:...// 需要隐式转换的接口定义为非成员函数{...};// 使用// 这里会编译错误,2不能隐式转换上面只是把24条款示例改为模版实现,然而模版版本是编译不过的,因为编译器并不知道2要转换为什么。编译器推断不了模版的隐式转换。对于模版我们只能通过friend和inline特性来实现非成员函数的定义。public:...// 这里Rational是Rational<T>的简写形式,在类模版内部可以简写。

m0_74795952的博客 1104

Effective C++ 读书笔记7

条款23:宁以non-member,non-friend替换member函数 请记住:宁可拿non-member non-friend函数替换member函数,这样做可以增加封装性,包裹弹性和机能扩展性 条款24:若所有参数皆需类型转换,请为此采用non-member函数 请记住:如果你需要为某个函数的所有参数(包括this指针所指的那个隐喻参数)进行类型转换,那么这个函数必

liyongOFDM的专栏 745
上一篇: Effective C++读书笔记之考虑写出一个不抛异常的swap函数
下一篇: Effective C++读书笔记之尽量少做转型动作
anthit
博客等级 码龄21年 13粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值