读书人

讨论CPP一个效率与可读性有关问题

发布时间: 2012-09-24 13:49:42 作者: rapoo

讨论CPP一个效率与可读性问题
例如有个类为
CTest,里面还有其他许多类成员对象,现在需要提供一个函数:
CTest GetObj();
这个函数作为一种接口提供出去,定制一个满足要求的对象返回,实现低耦合的对象设计
问题出来了,如果像上面那么定义,那么客户(实现这个函数的人,成为客户吧)很可能这样写:

C/C++ code
CTest GetObj(){  CTest RetObj;  //......  return RetObj;}//然后我这边调用就是CTest MyObj = GetObj();

那么这里就调用了很多次无意义的构造析构,包括其成员的构造析构。但是好处是,可读性好,任何人看到CTest GetObj();
的声明都知道,这里应该构造一个CTest的对象来返回。

换一种方式:
void GetObj(CTest& Obj);
然后我调用就是
C/C++ code
CTest Obj;GetObj(Obj);

这里优点很明显,只有一次构造析构,而缺点就是,客户可能看到void GetObj(CTest& Obj);不知道要做什么,至少第一眼看上去不知道。而且可读性也差。
请问各位遇到类似情况是如何取舍的呢?


[解决办法]
楼主自己测试过没有?
[解决办法]
类似的问题见仁见智,无定论。
[解决办法]
开的debug模式吧。
[解决办法]
那么客户(实现这个函数的人,成为客户吧)很可能这样写
——这个客户百分百不知道局部变量出函数就失效……

此外,编译器的优化能够去掉大量临时变量的构造与析构
虽然编译器有优有劣,但基本上,傻乎乎的按照程序员写的代码一次次构造析构的编译器是卖不出去的
[解决办法]
单就写法而言,我习惯第二种写法
原因是我水平低不习惯使用异常,每个函数都要返回bool做结果判断,所以干脆统一格式“所有输入输出全部放在参数列表里”
[解决办法]
return CTest();
另外楼主请搜返回值优化。

[解决办法]
用指针吧
[解决办法]
探讨

引用:

那么客户(实现这个函数的人,成为客户吧)很可能这样写
——这个客户百分百不知道局部变量出函数就失效……

此外,编译器的优化能够去掉大量临时变量的构造与析构
虽然编译器有优有劣,但基本上,傻乎乎的按照程序员写的代码一次次构造析构的编译器是卖不出去的


——这个客户百分百不知道局部变量出函数就失效……
兄弟你不知道返回值的话不是局部变量了吗?

[解决办法]
探讨

引用:

开的debug模式吧。


release模式发现,输出一样,调用两次构造两次析构

[解决办法]
release模式不能这样看,你有输出编译器当然不能把你“优化”掉

要看release模式,看反汇编

[解决办法]
首先说下,在现在的C++编译器来说

C/C++ code
CTest MyObj = GetObj();
[解决办法]
探讨
引用:

首先说下,在现在的C++编译器来说

C/C++ code
CTest MyObj = GetObj();




C/C++ code
CTest MyObj;
MyObj = GetObj();


是不一样的。一个是copy-constructor,一个是operator-assignment

所以这里很可能被优化成一次构造。……

[解决办法]
CTest GetObj()
产生一个新对象, 为什么不直接定义成构造函数?
如果是根据当前对象来产生新对象, 也可以定义一个以现有对象作为参数的构造函数撒.
[解决办法]
个人觉得,可读性优先。等确认只能通过牺牲可读性才能让效率达标时,再牺牲可读性。

读书人网 >C++

热点推荐