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)
- C++临时变量什么时候销毁
- C++讨厌的临时变量什么时候产生
- C/C++中的临时变量
- 返回一个临时变量的右值引用,那么临时对象什么时候释放?
- 自动释放池什么时候创建,什么时候销毁?
- 自动释放池什么时候创建,什么时候销毁?
- C语言中也有 临时定义变量
- [C++]引用参数与临时变量
- [c/c++]临时变量、局部变量,return的效率
- 什么时候c++会生成临时变量(2014年9月3日13:47:24)
- C语言交换变量之临时变量使用指针
- 临时变量
- 临时变量
- C++临时对象销毁时间
- 不用临时变量交换两个数的值(C实现)
- C:两个数直接交换,不用第三个临时变量
- c语言不用临时变量交换两个数程序分析
- 交换两个值,不用临时变量(C位运算)
- poj 2976 Dropping tests(最大化平均值)
- 树莓派GPIO引脚
- 【软工文档】机房收费系统之详细设计说明书
- 【设计模式】——总览
- centos7 开启80端口
- C++临时变量什么时候销毁
- Linux下Qt程序的打包发布
- 为什么 Android 手机总是越用越慢?
- ApiDemos之activity切换动画
- HDOJ 5240 Exam
- 为MyEclipse指定JDK
- LeetCode - 14. Longest Common Prefix
- scanf问题:先用一个scanf读入一个数后,在用一个scanf读入一个字符时,不等输入直接跳过!
- 【蓝桥第五周】小小故事