这个右值引用到底有什么用
c语言吧
全部回复
仅看楼主
level 5
怒人水瓶
楼主
禁用了优化,这儿右值引用re和变量re1看起来没有任何区别
2023年01月27日 18点01分
1
level 5
怒人水瓶
楼主
按照我的理解,
对于右值引用re,先是调用func3,在func3中,return后 变量c构造临时变量,这部分应该调用拷贝构造,re引用这个临时变量。
对于变量re1,先是调用func3,在func3中,return后 变量c构造临时变量,这部分应该调用拷贝构造,然后临时变量构造re1,此处调用移动构造。
为什么右值引用和普通变量没什么区别,还都是调用的移动构造?
2023年01月27日 18点01分
2
level 14
🍀草酱🍀
个人理解,CC没有重载=运算符,但是定义了移动构造和拷贝构造,那么当使用=的时候,就会选择移动构造和拷贝构造中的一个,而两者都存在会优先使用移动构造。
是否能调用移动构造只对=右边的原对象有要求,构造函数本身并没有返回值
2023年01月28日 00点01分
3
怒人水瓶
谢谢回复,一会儿我试着把赋值重载写出来,测试一下,不过我感觉我这儿没有赋值运算,=都是初始化
2023年01月28日 03点01分
🍀草酱🍀
@怒人水瓶
有点奇怪,确实少了一次,看别人的demo也是没有重载移动赋值运算符,调了两次移动。一次移动到返回值,一次移动到re1。
2023年01月28日 05点01分
level 1
五次围攻
这是NRVO,编译器默认做了优化,避免冗余的拷贝过程
2023年01月28日 00点01分
4
怒人水瓶
我禁用了优化的,开启优化也就是nrvo,只会各调用一次默认构造
2023年01月28日 03点01分
level 5
怒人水瓶
楼主
re1应该比re多调用一次移动构造,但是实际并没有?
2023年01月28日 03点01分
6
level 15
aaaaaaa421
1. nrvo 是 C++ 标准规定的可选"优化",而不是普通的优化操作,因此单纯地禁用优化并不代表禁用了 nrvo。gcc 中可以通过 -fno-elide-constructors 禁用相关"优化"(但即使如此也不能完全关闭,因为 C++17 起标准禁止编译器禁用部分拷贝"优化")。
2. 你这里看到的移动构造是 return 语句导致的,发生在 func3 内部,而不是外部,你的理解有误。
2023年01月28日 05点01分
7
怒人水瓶
是的,赞赞
2023年01月28日 05点01分
怒人水瓶
return 语句处为什么会是一个移动构造,return的c是一个左值,应该调用拷贝构造,请问这儿该怎么理解,大佬
2023年01月28日 06点01分
aaaaaaa421
@怒人水瓶
语法规定,return 一个满足要求的 id-expression 时编译器会先尝试移动构造,具体见
https://en.cppreference.com/w/cpp/language/return
。
2023年01月28日 06点01分
怒人水瓶
@aaaaaaa421
感谢大佬,懂了
2023年01月28日 07点01分
level 5
怒人水瓶
楼主
虽然还有很多疑问,简单总结一下。前面少了一次后移动构造是因为我标准是C++17,虽然我禁止了优化,在C++17中只能禁用一部分优化,禁用这部分的优化的编译选项是-fno-elide-constructors,下面我会在C++11中,分别在开启优化和没有开始优化进行测试,在禁用优化下针对纯右值 (rvalue)和将亡值 (xvalue)进行测试。有很多疑问,如果有大佬知道,请多多指点,谢谢。
2023年01月28日 05点01分
8
level 5
怒人水瓶
楼主
测试用例,
2023年01月28日 06点01分
9
level 5
怒人水瓶
楼主
开启优化,没有拷贝,只有各一次默认构造,nrvo
2023年01月28日 06点01分
10
level 5
怒人水瓶
楼主
关闭优化,可见左值多了一次移动构造,存在疑惑,为什么return c 是调用的移动构造,c是一个左值,应该调用拷贝构造呀?
2023年01月28日 06点01分
11
🍀草酱🍀
return 已经是最后一条语句了,局部变量c是将亡值,满足移动的条件,所以直接调用移动了?
2023年01月28日 09点01分
怒人水瓶
@🍀草酱🍀
七楼那儿有链接,reference里面>语句>return中,如果变量非volatile,返回的时候,会先将其假设为右值表达式,因此优先调用移动构造,若重载决议失败,则调用其他构造
2023年01月28日 10点01分
🍀草酱🍀
移动构造设计的初衷就是解决函数返回对象时深拷贝的问题,如果这种情况都不能移动,说实话这个功能就废了吧
2023年01月28日 10点01分
level 5
怒人水瓶
楼主
对于将亡值,关闭优化,不会有移动或者拷贝,但是出现指针悬挂
2023年01月28日 06点01分
12
1