RVO vs brak RVO

0
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.

  1. Czy moje obserwacje są poprawne?
  2. W którym miejscu są tworzone te obiekty lokalne w funkcji, bo tego w asm nie widzę.
1

Obie te funkcje to undefined behavior, więc nie wiadomo co robi ten assembler. Zmienne nie są zainicjalizowane.

Tutaj masz jak wygląda to normalnie: http://goo.gl/TP7PxY

0

Czyli RVO nie ma w without. Natomiast jest w withRVO. Zgoad?

0

Trudno mi powiedzieć co tam się dzieje, gdyż nie jestem assemblerowym ekspertem. Takie optymalizacje lepiej oglądać dodając po prostu odpowiednią instrumentację w kodzie.

Spójrz na to: http://ideone.com/5nEiPc

Jak widać w pierwszym przypadku nie ma NRVO, w drugim jest (ideone używa GCC i -O2).

1 użytkowników online, w tym zalogowanych: 0, gości: 1