struct S{
int a,b,c,d,e,f,g,h;
};
S withoutRVO(bool cond = false) {
S first;
S second;
return cond ? first : second;
}
S withRVO() {
S first;
return first;
}
080485eb <_Z10withoutRVOb>:
80485eb: 55 push %ebp
80485ec: 89 e5 mov %esp,%ebp
80485ee: 83 ec 68 sub $0x68,%esp
80485f1: 8b 45 0c mov 0xc(%ebp),%eax
80485f4: 8b 55 08 mov 0x8(%ebp),%edx
80485f7: 89 55 a4 mov %edx,-0x5c(%ebp)
80485fa: 88 45 a0 mov %al,-0x60(%ebp)
80485fd: 65 a1 14 00 00 00 mov %gs:0x14,%eax
8048603: 89 45 f4 mov %eax,-0xc(%ebp)
8048606: 31 c0 xor %eax,%eax
8048608: 80 7d a0 00 cmpb $0x0,-0x60(%ebp)
804860c: 74 05 je 8048613 <_Z10withoutRVOb+0x28>
804860e: 8d 45 b4 lea -0x4c(%ebp),%eax
8048611: eb 03 jmp 8048616 <_Z10withoutRVOb+0x2b>
8048613: 8d 45 d4 lea -0x2c(%ebp),%eax
8048616: 8b 55 a4 mov -0x5c(%ebp),%edx
8048619: 8b 08 mov (%eax),%ecx
804861b: 89 0a mov %ecx,(%edx)
804861d: 8b 48 04 mov 0x4(%eax),%ecx
8048620: 89 4a 04 mov %ecx,0x4(%edx)
8048623: 8b 48 08 mov 0x8(%eax),%ecx
8048626: 89 4a 08 mov %ecx,0x8(%edx)
8048629: 8b 48 0c mov 0xc(%eax),%ecx
804862c: 89 4a 0c mov %ecx,0xc(%edx)
804862f: 8b 48 10 mov 0x10(%eax),%ecx
8048632: 89 4a 10 mov %ecx,0x10(%edx)
8048635: 8b 48 14 mov 0x14(%eax),%ecx
8048638: 89 4a 14 mov %ecx,0x14(%edx)
804863b: 8b 48 18 mov 0x18(%eax),%ecx
804863e: 89 4a 18 mov %ecx,0x18(%edx)
8048641: 8b 40 1c mov 0x1c(%eax),%eax
8048644: 89 42 1c mov %eax,0x1c(%edx)
8048647: 8b 45 a4 mov -0x5c(%ebp),%eax
804864a: 8b 55 f4 mov -0xc(%ebp),%edx
804864d: 65 33 15 14 00 00 00 xor %gs:0x14,%edx
8048654: 74 05 je 804865b <_Z10withoutRVOb+0x70>
8048656: e8 85 fe ff ff call 80484e0 <__stack_chk_fail@plt>
804865b: c9 leave
804865c: c2 04 00 ret $0x4
0804865f <_Z7withRVOv>:
804865f: 55 push %ebp
8048660: 89 e5 mov %esp,%ebp
8048662: 83 ec 28 sub $0x28,%esp
8048665: 8b 45 08 mov 0x8(%ebp),%eax
8048668: 89 45 e4 mov %eax,-0x1c(%ebp)
804866b: 65 a1 14 00 00 00 - mov %gs:0x14,%eax
8048671: 89 45 f4 mov %eax,-0xc(%ebp)
8048674: 31 c0 xor %eax,%eax
8048676: 90 nop
8048677: 8b 45 e4 mov -0x1c(%ebp),%eax
804867a: 8b 55 f4 mov -0xc(%ebp),%edx
804867d: 65 33 15 14 00 00 00 xor %gs:0x14,%edx
8048684: 74 05 je 804868b <_Z7withRVOv+0x2c>
8048686: e8 55 fe ff ff call 80484e0 <__stack_chk_fail@plt>
804868b: c9 leave
804868c: c2 04 00 ret $0x4
Cześć :)
Teraz widzę, że przy zwracaniu wartości w funkcji withoutRVO w kodzie asm jest seria mov. Identyfikuję je jako kopiowanie zwracanej wartości. ( mam rację?). W funkcji withRVO tego zjawiska nie ma. I wszystko gra.
- Czy moje obserwacje są poprawne?
- W którym miejscu są tworzone te obiekty lokalne w funkcji, bo tego w asm nie widzę.