以传值方式返回一个对象,中间有没有临时对象的构造过程?一个朋友问我,觉得好像有,但是又不肯定。做了个简单的试验,一目了然。
测试用例:
-------------------------------------------------
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
class object
{
public:
int data;
public:
object() { printf("constructed!\n"); }
object(const object &o)
{
printf("constructed and copied.\n");
data = o.data;
};
object& operator = (const object &o)
{
printf("copied!\n");
data = o.data;
return *this;
}
~object()
{
printf("desturcted!\n");
}
};
object test()
{
object o;
o.data = 100;
return o;
}
int main()
{
object a;
a = test();
printf("%d\n", a.data);
return 0;
}
-------------------------------------------------
看一下几种编译器的运行结果:
Microsoft Visual C++ 6.0
Debug/Release
-------------------------------------------------
constructed!
constructed!
constructed and copied.
desturcted!
copied!
desturcted!
100
desturcted!
-------------------------------------------------
Borland C++ 5.5
-------------------------------------------------
constructed!
constructed!
constructed and copied.
desturcted!
copied!
desturcted!
100
desturcted!
-------------------------------------------------
g++ 3.4.4
-------------------------------------------------
constructed!
constructed!
copied!
desturcted!
100
desturcted!
-------------------------------------------------
看到了吧,VC和BC++结果是与预想的一样。而g++的结果不一样。以VC结果为例,分析如下:
-------------------------------------------------
constructed! --> a 的构造
constructed! --> o 的构造
constructed and copied. --> 临时对象的构造
desturcted! --> o 的析构
copied! --> 用临时对象对a 赋值
desturcted! --> 临时对象的析构
100
desturcted! --> a 的析构
-------------------------------------------------
VC++6和BC++比较“规矩”,先构造临时对象,然后再复制。而g++在没有使用优化参数(-O)的时候就已经进行了优化,没有临时对象的构造过程,直接复制,显然效率要高一些。
结论:对于一个class的对象传值,一般的编译器会构造一个临时对象,然后返回调用处再执行复制操作。但也有例外,比如g++。
PS: 我试验的时候先用g++,然后就以为没有临时对象的构造过程。幸亏用VC看了一下。
又平安地睡了一觉。醒来的时候,发现又是一个阳光明媚的日子。幸福的感觉真好。
接了小半盆水洗脸,用了半瓶水刷牙。暂时不能洗头了,将就将就。在食堂吃了顿早饭,然后去上课。平淡的日子,值得我珍惜。
不知道传说中的地震什么时候“莅临”,我已经先了解了一下他的脾气。最早听见关于地震的信息是20日晚上。当时以为是谣传,没放在心上,正常睡觉。这几天谣传似乎快要变成现实了,连食堂门口的宣传海报上写着“禽流感、水荒、地震——我们共同度过难关”。难怪昨晚凯的同学接二连三地打电话问,哈尔滨地震了么。
不知道earthquake会不会来拜访,在这之间,一些依旧正常。上课,看书,写程序,思想,听音乐......生活是那么的美好,珍惜每一天。
禽流感,水荒,地震。哈尔滨的11月是个多事之秋。
11月13日,吉林石化公司双苯厂化工厂爆炸,污染了松花江的源头。
11月21日起,水荒就渐渐笼罩在哈尔滨。当天去超市“抢水”的时候,已经没有矿泉水或者饮用水了。
21日晚,自来水渐渐地停了。暖水瓶里面存的是最后一次打的开水。停水已经成为事实
22日,学院、学校、政府开始发布公告。全市的服务业、餐饮业、娱乐业、工业,凡是与水相关的,几乎都停了。暖气几乎都要停了。
23日,超市有水了,一箱箱的纯净水摆在收银台旁边。排队买水的人,似乎还是那么多。至于地震,开始以为是谣言,现在更加确切了。大概就是这两天吧。希望朋友们都平安。
WeskitKeeper申请了“搜索技术版”,把我拉去联合申请。终于申请下来了,他告诉我说要版主实习才能走马上任。虽然一直想申请Computer版和LangHeaven两个版的版主,以前觉得版主实习太麻烦了,一直没有动作。这次既然要求这样,那就尝试一下。我旋风般地申请了版主实习,然后就在BM_Test2一展拳脚。先是mark文章,然后是制作合集,接下来砍贴子,还苦练整理精华区。蜘蛛侠的电影中有一句话,给我留下深刻的印象:“你的能力越大,你的责任越大。”做版主绝不是仅仅风光的事,更多的是责任与义务,因为你的权利很大。这是我看了不少的实习心得和版务版规的体会。经过一番努力和准备,我申请了考试。zjliu大哥负责我的考试。虽然我知道考试不会太难,但不少笔试题还是有点繁琐——需要不停的搜精华区。看出来找答案是个力气活——还有一些案例考察版主候选人能否正确地处理版务。回答操作题的时候,除了点麻烦:其实怪我太紧张了,一道“推荐帖子”的题目被我错误的操作了;一道“恢复删除”的题目,因为我没有仔细看,留下2个细节没有完成;更要命的是,发现还要回答“实习期间回答的问题”。一阵手忙脚乱后,终于完成了操作部分,也终于完成了实习考试。比正常考试都累。
暂时下线喝口茶,休息一下。再上线的时候发现zjliu发来的新,我已经被“恭喜”为版主了。七品芝麻官也是个官么,况且版主的权利还是很大的。我马上到“搜索技术版”(SearcHIT)和Manage_Science报道。朋友们在SearcHIT忙着RE(回帖)。
做版主需要花不少时间整理版务、精华区,还好组织讨论。在这个过程中,我相信能够锻炼我的组织能力、写作能力、责任心和合作能力。而且WeskitKeeper的开发热情高涨,我考完试之后可以参与,一个很好的锻炼!
昨天还有一个小故事:claudiosun和我在同一个训练营实习,昨天通过考试,即将走马上任。实现我们不熟悉,我也不知道他在那个版任职。在BM_Test2看见他发了一个投票(测试),题目是“你认为自然语言处理对信息检索来说有用吗?”,我猜他可能是王老师实验室的学生——因为学院似乎只有这两个实验室与信息检索有关。发信祝贺的时候,我加了一句“欢迎到SearcHIT版来玩”。当我回到SearcHIT的时候,看到大家都在RE一篇帖子,才发现claudiosun也成为了SearcHIT的版主。看来SearcHIT的人气超高,刚开版几天,就有三个版主了。以后我们可要一起合作,研习检索技术。
终于在HOJ(http://acm.hit.edu.cn)上提交过100题了,不容易啊。发文纪念。
注册帐号是很久以前的事了,偶尔做几道题,渐渐地积累到100题了。回想起来挺辛苦的。像我这么“大”年纪了,似乎不应该在这上面花时间了,但是有时确实是抑制不住写程序的欲望。从简单的模拟到复杂的动态规划,从只需打印的练习到需要冥思苦想的数学题,一点一点享受编程的乐趣——这应该是每个学计算机的学生都应该体验的。
这个期间,我有很多收获。在这里编程需要关心算法,考虑时间复杂度,有时甚至要考虑空间复杂度。为了能尽快的通过,还需要较劲脑汁去想,或者查资料。记得有一题是动态规划的题目,容易实现,但是总是超时。经过指点后,才知道需要用到“平行四边形”原理加速。研究不少题目的时候,我喜欢把Introduction to Algorithm, 2/e放在手边,是他帮助我解决不少问题。在做题过程中,我还阅读了一些代码,看到一些实现技巧,真是禁不住拍手叫绝。
100题,是一阶段的纪念,是另一个阶段的开始。
考完了才知道,学的真的是不怎么样。
我复习算认真,还做了一个思维导图。不过没有仔细看递推的部分,因为觉得还不错。没想到考试出现了一个二元递推方程组,真是郁闷。我记得高中时参加数学竞赛就是输在递推方程组得求解,没想到今天又栽倒这里了。其他题答得还可以。
考试必然紧张一点,有利也有弊。我今天看第一题——是一个鸽巢原理的题——当时想了30秒,觉得没有思路,先放过再说。等到答题进入状态后,再回头看第一题,觉得思路特别清晰,一会儿就写出来了。而另一题,本来很简单,结果紧张过头了,用错了解题的模型——还好,在最后的3.14分钟内,我突然想到错误所在,更正过来。
考试也好,比赛也好,一着急,平时的基本功就看出来了。估计去成都和北京参加ACM区域赛的song,L他们体会最深了。这次两个队在北京得了银牌,成绩比以往的要好了。大三的两元猛将,在HOJ上做了600+题,平时功夫应当了得了。在赛场上,可能还会有点紧张。人之常情。明年他们兴许拿个金牌呢。
PS:我大一如果解除ACM了,也许也能有机会参加区域赛。时光不再,此梦难圆。
周五晚上,X101被有史以来最多的人包围,几乎就是水泄不通:晚上7:00,李开复作为筹建Google研究院的主管进行了精彩的演讲。他介绍了Google的历史、使命和发展计划,用诙谐幽默的语言描述着一个“计算机科学家的乐园”,的确太吸引人了。如果Google要我,我真的舍得这个硕士学位。顺便提一下,今天晚上6:00-8:00考痛苦的“模式识别”——第一门考试——原本以为没有机会参加报告会了,结果模式识别题似乎还算简单,我在45分钟内搞定,然后花5分钟内检查一下,心想反正这样了,还是听报要要紧。于是在众目睽睽之下,我交了卷,奔出教室.....到X101正好是7:00。可惜人太多了,教室里能站人的地方,几乎都是人。从来没见过这么大的场面,可见李博士的超级人气。简直就是学生们的明星。中间还有个小插曲:刚开始,有一女生晕倒(不知道是不是幸福地晕倒,有待考证),弄得组织者紧张兮兮,号召临近门口的同学退场。用脚趾头想想也不能。这么辛苦地等来了开复李,哪又临阵退堂之理?无奈组织者只能号召大家注意安全,出现意外,要镇定,然后有秩序退场。也许他的担心不如道理,要是出现意外,后果...怪只怪他们低估了工大学生的人数,选择这么个教室。安排在礼堂不就得了。这是题外话。
下午有他的几个大牛部下的报告,我提问的时候获得了一本书:《做最好的自己》。晚上有幸得到李博士的签名,还有日期。这本书可是很有纪念意义哦,得好好保存。