文章目录
条款 26:尽可能延后变量定义式的出现时间
核心思想
-
程序清晰度
- 将变量的定义尽量延后,靠近其首次使用的地方,有助于提升代码的可读性。
-
程序效率
- 仅在需要时创建变量,可减少不必要的初始化和资源分配。
示例代码
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; }
分析
-
方法 A:定义于循环外
- 优点:减少了构造和析构操作,仅调用一次构造函数和析构函数。
- 缺点:引入了额外的赋值操作,若对象的赋值成本较高,会导致性能下降。
-
方法 B:定义于循环内
- 优点:变量的生命周期更短,仅在需要时创建和销毁,减少不必要的存储时间。
- 缺点:每次迭代都会调用构造函数和析构函数,增加了对象的创建销毁成本。
实践建议
-
权衡效率与可读性
- 若变量的构造和析构成本较低(例如内置类型),方法 B 通常是更好的选择。
- 若变量的赋值成本较低且构造成本较高,方法 A 可能更合适。
-
适配场景需求
- 在循环中仅需要对象的短生命周期时,优先选择方法 B。
- 当对象需要在循环外部访问时(如累积计算结果),使用方法 A。
总结
尽可能延后变量定义的出现时间,可以:
- 提高代码的可读性,减少潜在错误。
- 在合适场景下改善效率,但需权衡构造、析构和赋值的开销。
延后变量定义的原则适用于绝大多数情况下,但也应基于特定场景的性能需求灵活调整。