关于赋值构造函数

qq_33222223 2016-06-10 04:08:41
大家好,请看以下代码:

#include<iostream>

using namespace std;

class Point
{
public:
Point(int xx,int yy);
Point(const Point &p);
Point& operator = (const Point &p);
int getx(){return x;};
int gety(){return y;};
~Point() {
}
private:
int x;
int y;


};
Point::Point(int xx,int yy)
{
x=xx;
y=yy;
}
Point::Point(const Point &p)
{
x=p.x;
y=p.y;
cout<<"copy is ok\n";
}

Point& Point::operator= (const Point &p)
{
x=p.x;
y=p.y;
cout<<"= is ok\n";
}

Point func2()
{
Point a12(3,4);
return a12;
}


int main(int argc,char **argv)
{
Point p = func2();
return 0;
}





请问两个问题:
1.func2函数中a12作为返回值返回给func2,这里为什么没有生成临时的中间变量Point对象?
2.func2的返回结果不是返回给p吗?为什么没有调用拷贝构造函数吗?为什么结果没有输出""copy is ok\"?
...全文
252 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrankHB1989 2016-07-05
  • 打赏
  • 举报
回复
引用 11 楼 liuxing9345 的回复:
你怎么知道没有生成临时变量呢?你析构函数又没有输出什么东西,你在析构函数里面打印下信息就知道了,其实有个对象被析构了,所以它还是生成了临时变量的。你自己搞错了
g++就是默认不生成,反正是这种frontend里就完全确定的东西,跟一般所谓的优化就不在一个地方做。因为钦定引起改变observable behavior的东西不同于常规优化,形同unspecified behavior,一开始就不应该指望存在副作用,省得你乱调编译参数多此一举yy。其它类似的还有C++14的合并new之类。 cl倒是当成优化开关了。
FrankHB1989 2016-07-05
  • 打赏
  • 举报
回复
又是12.8/31的copy elision经问题。懒得背书了。 g++就-fno-elide-constructors。
bluewanderer 2016-07-03
  • 打赏
  • 举报
回复
呃,规范里abstract machine本来也没要求必须创建临时对象...
bluewanderer 2016-07-03
  • 打赏
  • 举报
回复
引用 11 楼 liuxing9345 的回复:
你怎么知道没有生成临时变量呢?你析构函数又没有输出什么东西,你在析构函数里面打印下信息就知道了,其实有个对象被析构了,所以它还是生成了临时变量的。你自己搞错了
标准允许编译器忽略临时对象直接构造abstract machine里用临时对象初始化的那个对象。而且as if原则在这里不适用,副作用不做要求,所以即便构造函数和析构函数有输出也不受影响。
liuxing9345 2016-07-03
  • 打赏
  • 举报
回复
你怎么知道没有生成临时变量呢?你析构函数又没有输出什么东西,你在析构函数里面打印下信息就知道了,其实有个对象被析构了,所以它还是生成了临时变量的。你自己搞错了
paschen 版主 2016-06-11
  • 打赏
  • 举报
回复
参看:http://blog.csdn.net/yao_zou/article/details/50759301 另参看:《深度探索C++对象模型》
qq_33222223 2016-06-10
  • 打赏
  • 举报
回复
引用 6 楼 csshow 的回复:
[quote=引用 4 楼 qq_33222223 的回复:] [quote=引用 1 楼 lm_whales 的回复:] 因为返回值优化,把临时变量,和复制全都优化掉了 你关闭优化看看啥情况
请问一下,如何关掉优化?[/quote] 你用的什么IDE.或者是编译器[/quote] 我用的是g++
renwotao2009 2016-06-10
  • 打赏
  • 举报
回复
1 编译器优化,RVO机制 2 仍然是RVO机制部分
小灸舞 2016-06-10
  • 打赏
  • 举报
回复
返回值优化(Return Value Optimization,简称RVO),是这么一种优化机制:当函数需要返回一个对象的时候,如果自己创建一个临时对象用户返回,那么这个临时对象会消 耗一个构造函数(Constructor)的调用、一个复制构造函数的调用(Copy Constructor)以及一个析构函数(Destructor)的调用的代价。而如果稍微做一点优化,就可以将成本降低到一个构造函数的代价,如果是用的VS,Debug模式(没有优化)和Release模式就不一样(在GCC下测试的时候可能编译器自己进行了RVO优化,看不到两种代码的区别)
slmax1 2016-06-10
  • 打赏
  • 举报
回复
引用 4 楼 qq_33222223 的回复:
[quote=引用 1 楼 lm_whales 的回复:] 因为返回值优化,把临时变量,和复制全都优化掉了 你关闭优化看看啥情况
请问一下,如何关掉优化?[/quote] 你用的什么IDE.或者是编译器
slmax1 2016-06-10
  • 打赏
  • 举报
回复
在return a12的时候,C++编译器,首先将创建一个匿名对象,然后用a12对象去初始化这个匿名对象,这个时候就会调用匿名对象的拷贝构造函数(俗称return副本),接着a12析构,func2()函数返回 在p接收到func2()函数返回的匿名对象之后(=号操作符之后),匿名对象析构 一点浅析.希望有大神指点.
qq_33222223 2016-06-10
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
因为返回值优化,把临时变量,和复制全都优化掉了 你关闭优化看看啥情况
请问一下,如何关掉优化?
slmax1 2016-06-10
  • 打赏
  • 举报
回复
vs2013 返回 copy is ok 可能是编译优化的问题.
Saleayas 2016-06-10
  • 打赏
  • 举报
回复
函数在返回的时候,使用的 汇编代码是 ret 。 此时不管函数需要返回什么,都约定是 AX 寄存器中的值。 哪怕是 void 函数,也是一样的。 但是假如 返回值的大小大于 DX:AX 的所能包含的。 那么编译器会把函数的返回值当作最后一个参数。 在呼叫函数的时候,会在堆栈上创建一个临时的返回值。 然后当作参数压栈。
lm_whales 2016-06-10
  • 打赏
  • 举报
回复
因为返回值优化,把临时变量,和复制全都优化掉了 你关闭优化看看啥情况

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧