作者amamoimi (佛仔)
看板C_and_CPP
标题[问题] 关於 return value optimization的问题
时间Sun Jan 21 21:24:43 2024
最近读的书上有个范例程式码
https://onlinegdb.com/f93sPV8B2
书上有给Turbo C++ 和Symantec C++ 的run
(那本书蛮老了)
总之turbo是在104行呼叫reserve函数的时候有呼叫copy constructor
而symantec没有(查了一下才知道rvo,应该没错(?))
没有rvo的版本因为函数return後tmp就被解构了所以c3的str没办法正确印出
书上有提供的解法是我在class里定义(目前是用标注)的=运算子多载
问题点1.
没有rvo(turbo)的版本,应该是要用 Charstr operator=(Charstr inobj)
?(即不用reference)
因为reverse 的传回值不是左值(?
因为我用的编译器是有rvo的所以也不知道这样对不对...
问题点2.
我目前用的是环境dev c++,拿这个程式去编译会是有rvo
试着把注明里的部分加上去看看
结果过不了...
用
Charstr operator=(Charstr inobj)
也过不了
请问这是为什麽呢?
新手无知...不好意思,谢谢
----
Sent from
BePTT on my OPPO CPH1943
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.200.243.113 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1705843485.A.C6E.html
1F:推 wulouise: gcc支援copy elision很久了,dev c++不要用 godbolt方便01/21 23:12
2F:→ wulouise: godbolt assembly都直接展开给你看,不用自己写dtor测试01/21 23:13
3F:推 Dracarys: 跟copy elision没有关系,而是c3 = c2.reverse();呼叫01/22 22:02
4F:→ Dracarys: 到了implicit copy assignment operator,只会做member01/22 22:02
5F:→ Dracarys: -wise copy,所以c3的_str和等号右边的一样,指到的arr01/22 22:02
6F:→ Dracarys: ay都会被等号右边的prvalue的destructor干掉。如果遵守01/22 22:02
7F:→ Dracarys: rule of 0/3/5就不会被这deprecate很久的功能雷到:01/22 22:02
9F:→ Dracarys: 没客制化copy-assignment 的sanitizer output:01/22 22:02
11F:→ Dracarys: uncomment掉就好了01/22 22:02
谢谢楼上两位大大 对我之前搞错了...不管哪个版本c2.reverse()都在赋值给c3之後被解构
了(但是dev c++可以output 出正常的array(咦?))
还有运算子的部分还是很迷惑 我试了一下如果把copy constuctor删掉,用非参照的方式多
载=就过的了了(当然还是印不出array)
到底发生了什麽事...
※ 编辑: amamoimi (1.200.243.113 台湾), 01/23/2024 07:48:17
12F:推 wulouise: sorry我没看code qq 01/24 11:23