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

参考 effective c++ 条款 26

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

前言:

只要定义一个变量而其类型带有个构造或者析构,那么当程序的控制流也就是执行到这句变量定义时
那么就要承担构造的成本,当变量离开这个作用域时,就要承担析构的成本。
即使这个变量你没有使用,任然需要耗费这些成本,所以应该尽可能的避免这种情形。

或许 你认为 你不可能定义一个 不使用的变量  。

看下面!

string password(const string& password)
{
	string str;
	if(password.length() < xxx)
		throw error("xxxxxxx");
	
	return str; 
}

上面的对象 str 也是定义了 但是如果出现了 抛出异常 那么他就是未使用了
但是 未使用的变量 还要承担构造的成本 这不合适
所以最好 延后str 的定义,直到需要他的时候。

string password(const string& password)
{
	
	if(password.length() < xxx)
		throw error("xxxxxxx");
		
	string str;				//把 str 的定义放到这里 直到需要他的时候 
	return str; 
}

这样写还不够 , str 虽然定义 但是没有任何实参做 初值,还是要调用 defult 的构造
然后 你想操作一个变量 肯定是定义完成 在赋值
这样效率就不如在定义时 就赋值初值比较好

string str; 

str = "hello";

///// 不如下面的效率高/////

string str("hello");


看完这条 我们更加理解 尽可能延后变量定义式的出现时间
不应该只是延后变量定义
还要尽可能的延后直到给他赋值初值作为参数
这样不仅避免了 没必要的构造和析构 还避免了 default的构造 和 赋值操作 。

循环怎么办?

看下面两个哪个比较好

widget w;

for(int i = 0; i < n;i++)
	w = i
	....


for(int i = 0; i < n;i++)
	widget w(i);
	...
	

上面的两种方法
方法1: 一个构造 + 一个析构 + n个赋值
方法2: n个构造 + n 个析构

如果 class widget 的一个赋值成本 低于 (构造+析构成本) 方法1比较好
当 n 很大时 或者 方法2比较好.
还有个问题 方法1的作用域覆盖整个循环 要比方法2的作用域大,可能会造成代码易读和维护变差
除非你知道 赋值成本 低于 (构造+析构成本) 否则 还是推荐使用方法2

记住:

尽可能延后变量定义式的出现时间,这样可以增加程序的清晰度并改善程序的效果
发布了194 篇原创文章 · 获赞 443 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/weixin_42837024/article/details/105203795
今日推荐