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

文章目录

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


核心思想

  1. 程序清晰度

    • 将变量的定义尽量延后,靠近其首次使用的地方,有助于提升代码的可读性。
  2. 程序效率

    • 仅在需要时创建变量,可减少不必要的初始化和资源分配。

示例代码

cpp 复制代码
#include <iostream>

class Widget {
public:
    Widget(int value = 0) : value_(value) {
        std::cout << "Constructing Widget with value: " << value_ << std::endl;
    }
    ~Widget() {
        std::cout << "Destructing Widget with value: " << value_ << std::endl;
    }
    Widget& operator=(int value) {
        value_ = value;
        std::cout << "Assigning Widget with value: " << value_ << std::endl;
        return *this;
    }
private:
    int value_;
};

void methodA(int n) {
    std::cout << "\nMethod A:" << std::endl;
    Widget w; // 定义于循环外
    for (int i = 0; i < n; ++i) {
        w = i; // 赋值操作
    }
}

void methodB(int n) {
    std::cout << "\nMethod B:" << std::endl;
    for (int i = 0; i < n; ++i) {
        Widget w(i); // 定义于循环内
    }
}

int main() {
    int n = 3;
    methodA(n);
    methodB(n);
    return 0;
}

分析

  1. 方法 A:定义于循环外

    • 优点:减少了构造和析构操作,仅调用一次构造函数和析构函数。
    • 缺点:引入了额外的赋值操作,若对象的赋值成本较高,会导致性能下降。
  2. 方法 B:定义于循环内

    • 优点:变量的生命周期更短,仅在需要时创建和销毁,减少不必要的存储时间。
    • 缺点:每次迭代都会调用构造函数和析构函数,增加了对象的创建销毁成本。

实践建议

  1. 权衡效率与可读性

    • 若变量的构造和析构成本较低(例如内置类型),方法 B 通常是更好的选择。
    • 若变量的赋值成本较低且构造成本较高,方法 A 可能更合适。
  2. 适配场景需求

    • 在循环中仅需要对象的短生命周期时,优先选择方法 B。
    • 当对象需要在循环外部访问时(如累积计算结果),使用方法 A。

总结

尽可能延后变量定义的出现时间,可以:

  1. 提高代码的可读性,减少潜在错误。
  2. 在合适场景下改善效率,但需权衡构造、析构和赋值的开销。

延后变量定义的原则适用于绝大多数情况下,但也应基于特定场景的性能需求灵活调整。

相关推荐
Iruoyaoxh13 分钟前
栈和队列~
java·开发语言
noipp20 分钟前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
Hrain-AI21 分钟前
2026 企业 AI 编程智能体实战:Codex 与 Claude Code
开发语言·人工智能·kotlin
c2385634 分钟前
C/C++每日一练6
c语言·c++·算法
wdfk_prog1 小时前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式
oort1231 小时前
吃上了自家的细糠,还挺丝滑,用起来手感还行,OortCloud发布新版AI编程平台,下载 OortCodex,Token多,免费薅
大数据·开发语言·人工智能·ai编程
念恒123061 小时前
网络基础
linux·网络·c++
slandarer1 小时前
MATLAB | 泰勒图绘制,支持各种角度范围
开发语言·数学建模·matlab·nature·顶刊·泰勒图
mct1231 小时前
c++ iconv 字符utf-8转换gb2312失败
开发语言·c++
ziguo11221 小时前
Windows API 文件操作超级指南——从入门到内核
c++·windows·visualstudio