C++临时变量什么时候销毁

来源:互联网 发布:4g逛淘宝用多少流量 编辑:程序博客网 时间:2024/04/30 22:21

https://www.zhihu.com/question/23511471

和上面的问题差不多。

http://www.cnblogs.com/xkfz007/articles/2506022.html

但是还是不算太清楚,所以打算自己测试下,

平台x86_64,win7,在vs2012上测,没有开优化选项/Od

1.

int main(int argc, char **argv) {Rational x(1, 5), y(2, 9);Rational z = x * y;cout << "calc result: " << z.numerator() << "/" << z.denominator() << endl;return 0;}
#include <iostream>using namespace std;class Rational{friend  Rational operator*(const Rational& lhs, const Rational& rhs);public:Rational(int numerator = 0, int denominator = 1) : n(numerator), d(denominator) {cout << "Constructor Called..." << endl;}~Rational() {cout << "Destructor Called..." << endl;}Rational(const Rational& rhs) {this->d = rhs.d;this->n = rhs.n;cout << "Copy Constructor Called..." << endl;}Rational& operator=(const Rational&);int numerator() const { return n; }int denominator() const { return d; }private:int n, d;}; 
#include "Rational.h" Rational operator*(const Rational& lhs, const Rational& rhs) {cout << "----------- Enter operator* -----------" << endl;Rational tmp(lhs.numerator() * rhs.numerator(),lhs.denominator() * rhs.denominator());cout << "----------- Leave operator* -----------" << endl;return tmp;}
结果:



这个地方表示有点奇怪,按说我编译器没开优化,应该有两次拷贝构造,一次是在函数返回拷贝构造临时对象,另一次是在mian中使用临时对象拷贝构造z。但是发现这里只有一次拷贝构造发生。

转到G++编译测试,不优化(-O0),结果:


更逆天。。。,  是不是不开优化选项,编译器还有最基本的优化啊,看得到这篇,知道的大哥留言回复下,谢谢


2.换成引用:

int main(int argc, char **argv) {Rational x(1, 5), y(2, 9);Rational &z = x * y;cout << "calc result: " << z.numerator() << "/" << z.denominator() << endl;return 0;}







3.

int main(int argc, char **argv) {Rational x(1, 5), y(2, 9);x * y;cout << "calc result: " << endl;return 0;}
结果:

注意看到第二个析构打印,其顺序变了,在“calc result:”之前了,不难推测是x*y产生的临时对象销毁产生的,关键是,它这次是在“calc result:”之前销毁的,也即生成它的下一个语句。而前面两个输出,表明它是在mian退出时销毁的。

• Temporary objects are destroyed at the end of the full expression in which the
temporary was created.

但是可以看到引用延长了临时变量的生命周期,当一个临时性对象被绑定于一个reference,对象将残留,直到初始化之reference的生命结束,或直到临时对象的scope结束。

 const引用能够绑定到临时对象, 并将临时对象的生命周期由"创建临时对象的完整表达式"提升至"绑定到的const引用超出作用域"。 non-const 引用没有这个功能(C++03)

0 0
原创粉丝点击