[问题] 关于 return value optimization的问题

楼主: amamoimi (佛仔)   2024-01-21 21:24:43
最近读的书上有个范例程式码
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)
也过不了
请问这是为什么呢?
新手无知...不好意思,谢谢
作者: wulouise (在线上!=在电脑前)   2024-01-21 23:12:00
gcc支援copy elision很久了,dev c++不要用 godbolt方便godbolt assembly都直接展开给你看,不用自己写dtor测试
作者: Dracarys (MayShowGunMore)   2024-01-22 22:02:00
跟copy elision没有关系,而是c3 = c2.reverse();呼叫到了implicit copy assignment operator,只会做member-wise copy,所以c3的_str和等号右边的一样,指到的array都会被等号右边的prvalue的destructor干掉。如果遵守rule of 0/3/5就不会被这deprecate很久的功能雷到:https://eel.is/c++draft/depr.impldec没客制化copy-assignment 的sanitizer output:https://godbolt.org/z/1KKrb6bMouncomment掉就好了
作者: wulouise (在线上!=在电脑前)   2024-01-24 11:23:00
sorry我没看code qq

Links booklink

Contact Us: admin [ a t ] ucptt.com