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

实验六 存储器实验 只读存储器(ROM)是一种在正常工作时其存储的数据固定不变,其中的数据只能读出,不能写入,即使断电也能够保留数据,要想在只读存储器中存入或改变数据,必须具备特定的条件。当地址为00000101时,会分别在数据位宽为8,16,32的只读寄存器中找到地址为00000101所对应的十进制地址位置,也就是地址为5的数据,并将其分别以8位,16位,32位输出。因此,输出保持为0。因此,当异步清零信号为1时,无论其他输入信号是什么,触发器的输出都会被强制清零,输出为0。1)寄存器输入0011,使能端1,异步清零0。 阅读详情

.
在C++中,尽可能延后变量定义的出现时间,主要原因是为了提供代码的可读性,减少不必要的开销以及避免潜在的错误。
1、代码执行过程中抛出异常

  • 如果在代码开头定义了变量,但在后续代码中抛出了异常,可能导致变量在未被使用的情况下就被构造和析构,造成资源浪费
#include <iostream>
#include <stdexcept>

void processData(bool shouldThrow) {
    std::string data = "Some data"; // 过早定义变量
    if (shouldThrow) {
        throw std::runtime_error("An error occurred!");
    }
    std::cout << data << std::endl; // 可能不会执行
}

// 修改后代码
void processData(bool shouldThrow) {
    if (shouldThrow) {
        throw std::runtime_error("An error occurred!");
    }
    std::string data = "Some data"; // 延后定义变量
    std::cout << data << std::endl;
}

int main() {
    try {
        processData(true);
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
    }
    return 0;
}

2、对象使用前先调用构造函数,接着进行赋值操作

  • 在定义变量时未初始化,而是先调用默认构造函数,再通过赋值操作设置值,会导致额外的开销。可以直接通过构造函数初始化变量
#include <iostream>
#include <string>

void processData(const std::string& input) {
    std::string data; // 默认构造
    data = input;     // 赋值操作
    std::cout << data << std::endl;
}

//修改后代码
void processData(const std::string& input) {
    std::string data = input; // 直接通过构造函数初始化
    std::cout << data << std::endl;
}

int main() {
    processData("Hello, World!");
    return 0;
}

3、循环语句中构造函数和析构函数的调用情况
3.1、在循环内构造和赋值

  • 成本: n个构造函数 + n个析构函数
void processInLoop() {
    for (int i = 0; i < 3; ++i) {
        Widget w("Widget_" + std::to_string(i)); // 在循环内构造
        w = Widget("Assigned_Widget_" + std::to_string(i)); // 在循环内赋值
    }
}

3.2、在循环外构造,在循环内赋值

  • 成本: 1个构造函数 + n个赋值 + 1个析构函数
  • 具体如何使用,需要根据情况进行成本判断
void processOutsideLoop() {
    Widget w("Initial_Widget"); // 在循环外构造
    for (int i = 0; i < 3; ++i) {
        w = Widget("Assigned_Widget_" + std::to_string(i)); // 在循环内赋值
    }
}

思维导图笔记:
请添加图片描述

用4690张图片搞定物流仓储难题:手把手教你训练YOLOv8纸箱检测模型(附完整源码) 本文详细介绍了如何利用YOLOv8目标检测技术解决物流仓储中的纸箱识别难题。通过4690张图片构建高质量数据集,提供完整的训练教程和源码,实现98.7%的mAP@0.5准确率。文章涵盖数据采集、模型训练、调参技巧到边缘计算部署的全流程,帮助读者快速构建智能仓储检测系统。 阅读详情

相关推荐

Unity 2022打包Android APK:手把手教你创建和配置第一个签名Keystore(避坑指南)

本文详细介绍了Unity 2022打包Android APK时创建和配置签名Keystore的全流程,包括环境准备、Keystore创建、高级配置避坑指南以及签名验证与故障排查。特别强调了Android应用签名的重要性及安全维护策略,帮助开发者避免常见错误,确保应用顺利发布。

weixin_27379781的博客 241

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

深入解析 Effective C++ 条款26:尽可能延后变量定义式的出现时间,通过代码示例分析延后定义带来的性能提升与代码清晰度改善。

凡人叶枫的博客 177

QGIS:安装Deepness插件+应用

简单的描述了deepness的安装应用历程,重点是记录博主本次遇到的坑

fengyi157的博客 2336

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

Effective_C++_26

君鼎的博客 434

雪亮工程视频联网技术详解:视综平台主流接入方式与协议分析

随着雪亮工程建设的深入,视频资源的汇聚与共享成为核心需求。本文简要剖析了雪亮视综平台下的视频联网接入技术,重点讲解了主流接入方式的区别与选型,并深入探讨了平台内部及跨平台的视频资源共享机制(含级联与推送模式),旨在为安防开发人员和系统集成商提供清晰的架构思路与技术参考。

lsz152590的博客 718

告别全局搜索!7种SRP-PHAT快速算法实战对比:哪个更适合你的麦克风阵列?

本文深入探讨了7种SRP-PHAT改进算法在声源定位领域的实战表现,包括SRC、CFRC、SPF等方案。通过对比计算效率、定位精度和环境鲁棒性等核心指标,为不同场景(如会议室、智能家居、工业机器人)提供算法选型建议,帮助工程师优化麦克风阵列性能。

weixin_42546392的博客 397

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

第四章、Isaacsim在GUI中构建机器人(3):添加摄像头和传感器

本节。

m0_47719040的博客 2495

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

只要你定义了一个变量, 并且其类型带有构造函数或析构函数, 那么当程序控制流到达变量定义式时, 你便得承担构造成本; 当变量离开作用域时, 你便得承担析构成本. 本条款希望我们避免定义变量但最终并未使用的情况, 不要白白浪费构造和析构的成本.

tianmu_sama的博客 396

编写一个期货跨期套利的程序,谈谈思路及案例

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1718

【Python】解决 ERROR: Exception:Traceback (most recent call last):(亲测有效)

1、遇到问题2、问题解决

Fanjufei的博客 1万+

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

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款26:尽可能延后变量定义式出现的时间 Pospone variable definations as long as possible. 只要定义一个变量而其类型带有一个构造函数或析构函数,那么当程序的控制流到...

HakunaMatata的博客 357

【经验&技巧】如何在ADS中导入示波器的时域波形?

从示波器中导出的时域波形数据,需要按照固定的格式进行修改,并通过Display dataset对话框导入ADS。

一只豌豆象的博客 1572

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

程序清晰度将变量的定义尽量延后,靠近其首次使用的地方,有助于提升代码的可读性。程序效率仅在需要时创建变量,可减少不必要的初始化和资源分配。提高代码的可读性,减少潜在错误。在合适场景下改善效率,但需权衡构造、析构和赋值的开销。延后变量定义的原则适用于绝大多数情况下,但也应基于特定场景的性能需求灵活调整。

weixin_42255569的博客 480

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

一、变量定义的成本 只要你定义一个变量,该变量带有构造函数与析构函数,那么: 当你定义这个变量时就要执行它的构造函数 变量生命周期结束后就要执行他的析构函数 二、尽量延迟变量定义的时间 变量定义需要执行构造与析构函数,因此在某些情况下为了提高程序的效率,应该延迟变量定义的时间。请看下面的演示案例: 演示案例 下面定义一个函数,用来对密码进行加密,如果参数传入的密码过段就抛出一个...

董哥的黑板报 1099

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

Scott Meyers大师在Effective C++中说:尽可能延后变量式的出现时间。 我是很认可这个观点的。         每个人都有自己的习惯, 每次看到这样的代码, 我就感觉到不太舒服: #include using namespace std; int main() { int a, b, c, d, e, f, g; // ...... a = 1; b

认知 行动 坚持 7302

Camera2Demo

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

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

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

UE引擎开发工程师 1279

Effective C++ 学习笔记 条款26 尽可能延后变量定义式的出现时间

因此除非(1)你知道赋值成本比“构造+析构”成本低,(2)你正在处理代码中效率高度敏感(performance-sensitive)的部分,否则你应该使用做法B。你不只应该延后变量的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初值实参为止。如果这样,不仅能够避免构造(和析构)非必要对象,还可以避免无意义的default构造行为。只要你定义了一个变量而其类型带有一个构造函数或析构函数,那么当程序的控制流(control flow)到达这个变量定义式时,你便得承受构造成本;

tus00000的博客 551

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

一、变量定义的成本 只要你定义一个变量,该变量带有构造函数与析构函数,那么: 当你定义这个变量时就要执行它的构造函数 变量生命周期结束后就要执行他的析构函数 二、尽量延迟变量定义的时间 变量定义需要执行构造与析构函数,因此在某些情况下为了提高程序的效率,应该延迟变量定义的时间。请看下面的演示案例: 演示案例 下面定义一个函数,用来对密码进行加密,如果参数传入的密码过段就抛出一个logic_error异常(见条款54) //参数:要加密的密码 //返回值:加密后的密码 std::st

www_dong的博客 294

Effective C++ 条款26_尽可能延后变量定义式的出现时间_非同凡响

Postpone variable definitions as long as possible 只要你定义了一个变量而其类型带有一个构造函数或析构函数,那么当程序的控制流(control flow)到达这个变量的定义式时,你便得承受构造成本;当这个变量离开其作用域时,你便得承受析构成本。即使这个变量最终并未被使用,仍需耗费这些成本,所以你应该尽可能避免这种情形。 或许你会认为,你不可能定义一个不使用的变量,但话不要说的太早,看看下面这个函数,它计算通行密码的加密版本而后返回,前提是密码够长。如果密码太短

嘟嘟的博客 432

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

1. 如果变量定义得过早,那么如果在变量定义后被用到之前出现异常,变量未被用到,但仍然要承担构造和析构成本,此外变量用时再定义也便于查找变量,增加代码可读性. 2. 对于循环,除非赋值成本比构造和析构成本低且程序对效率高度敏感,将变量定义放在循环内部可以限制变量作用域,增强程序的可理解性和易维护性. // // main.cpp // 条款26:尽可能延后变量定义式的出现时间 // //...

yuleidnf的博客 235

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

变量不需要在函数开头定义,在用的时候定义就行了 std::string encryptPassword(const std::string& password) { using namespace std; string encrypted; if (password.length()<MinimumPasswordLength) { throw logic_error("Password is too short"); }

zion--6135的博客 451

Effective C++条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)

Effective C++条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)

CltCj的博客 1435

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

《Effective C++》 条款26:尽可能延后变量定义式的出现时间 只要你定义了一个变量而其类型带有一个构造函数和析构函数,那么当程序的控制流到达这个变量定义式时,你便得承受构造成本;当这个变量离开作用域时,你便得承受析构成本。即使这个变量最终并未被使用,仍需耗费这些成本,所以你应该尽量避免这种情形。 对于“尽可能延后”的理解: ...

weixin_33743248的博客 88

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

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

Do-Program的专栏 279

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

(一) 那么当程序的控制流到达这个变量定义时,变承受构造成本;当变量离开作用域时,便承受析构成本。 string encryptPassword(const std::string& password) { using namespace std; string encrypted; if(password.length() < MinimumPasswordLengt) { t

u010470972的专栏 804
上一篇: [Effective C++]条款25:考虑写出一个不抛异常的swap函数
下一篇: [Effective C++]条款27:尽量少做转型动作
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值