Wpis z mikrobloga

@TheMoonTheMoon: pytanie jak najbardziej słuszne, nie słuchaj tamtych idiotów, przecież dopiero się uczysz. odpowiedź jest troszkę bardziej skomplikowana. Polecam wrócić do problemu później, sam będziesz wiedział co, jak i dlacego.

optymalizacja kompilatora, miejsce przechowywania symbolu v (rw, r itd a to zalezy od targetu, opcji linkowania itd). sprawdź co się dzieje na innych targetach, z innymi opcjami kompilacji.
dlaczego? bo to "undefined behavior".

po skompilowaniu masz takie coś:

push rbp
mov
  • Odpowiedz
@dr__slim: on trolluje, on w przeciwienstwie do nas zna odpowiedzi na pytania ktore zadaje xD

tutaj ja nie do konca rozumiem dlaczego to nie dziala, ogolnie roznica z const a bez jest taka:

movl $5, -12(%rbp)
movl $10, -12(%rbp)
vs

movl $5, -12(%rbp)
leaq -12(%rbp), %rax
movl $10, (%rax)
Ja sie nie podejmuje wyjasnien dlaczego to drugie nie dziala, a debugowac mi sie nie chce bo od lat nie uzywalem gdb
  • Odpowiedz
@TheMoonTheMoon: Standard mówi jasno że modyfikowanie consta przez takie casta to UB, a jak masz UB to nie możesz oczekiwać żadnego konkretnego zachowania programu, wiec dlaczego spodziewasz się że wartość się zmieni? ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@filozof900: Kompilator może se optymalizować. Nie wiem co tu się dzieje dokładnie, ale oczywiście pod adresem jest nowa wartość. Kompilator na bank gdzieś trzyma informację, że v = 5, a jak chcesz wymusić aby za każdym razem odczytywał wartość spod adresu musisz zadeklarować zmienną jako volatile const int.
  • Odpowiedz
@TheMoonTheMoon: aaa no tak racja, ja sobie wywaliłem printy dla ułatwienia a tam tak na prawdę jest coś takiego:

movl $5, -12(%rbp)
leaq -12(%rbp), %rax
movl $10, (%rax)
cout:

movl $5, %esi
leaq _ZSt4cout(%rip), %rdi
call _ZNSolsEi@PLT
Czyli kompilator sobie zoptymalizował twój kod do czegoś takiego:

cout << 5 << " " << v;
  • Odpowiedz