Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Odpovědět
5.3.2013 12:58
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:5.3.2013 13:57

Program se zkompiluje (měl by s warningem). Výsledek je teoreticky nedefinovaný, ale prakticky by se mělo vypsat 99, jelikož mezi voláním funkce a výpisem není nic, tzn. na stacku se nic nealokuje, paměť kde byly uloženy hodnoty proměnné a z funkce foo i když dealokovaná zůstává nezměněna, tudíž x a y budou pořád odkazovat na čísla 49 a 50 až do té doby, dokud se na stacku tahle část paměti nerealokuje a nezmění.

EDIT: Samozřejmě počítám s tím, že program běží v jednom vlákně.

Editováno 5.3.2013 13:58
 
Nahoru Odpovědět
5.3.2013 13:57
Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:5.3.2013 14:04

Teď mi došlo že je to blbost, protože to druhý volání tu paměť přepíše, takže se vypíše 100, protože v tom místě je čislo 50, a obě reference na něj odkazujou.

 
Nahoru Odpovědět
5.3.2013 14:04
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Lukáš Hruda
Lukáš Hruda:5.3.2013 14:10

Ale teď mi došlo že je to blbost protože deklarace reference y ten stack posune, takže by se mělo vypsat těch 99 :D

 
Nahoru Odpovědět
5.3.2013 14:10
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:5.3.2013 14:15

Asi souhlasím, jen ten případný výsledek by měl být spíš 100, protože při prvním zavolání se sice na zásobník uloží 49, ale po výstupu z funkce se stack pointer zase posune zpátky, takže druhé volání té funkce s parametrem 1 (který se předá nejspíš přes registr) pak znova zapíše na to samé místo v zásobníku, tentokrát 49+1, tedy 50 a x i y budou ukazovat na stejné místo v zásobníku, i když vlastně v tu chvíli ta pamět součástí zásobníku není - je to jen ta paměť rezervovaná pro zásobník.

Nahoru Odpovědět
5.3.2013 14:15
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:5.3.2013 14:29

Teď jsem to zkoušel v Dev-C++ a očividně záleží na kompilátoru. Protože mi sice vyhodil warning, ale po vypsání adres jsem zjistil, že tu paměť nedealokoval a posouval stack pořád dál. Možná kompilátor pozná že vracíš referenci, a bere obsah funkce jako obsah volající funkce, ale z toho co vim o C++ by to tak bejt nemělo.

 
Nahoru Odpovědět
5.3.2013 14:29
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:5.3.2013 14:39

Tak ne, při zapnutí maximální optimalizace (což já mam) se stack nedealoku s koncem funkce, ale posouvá se pořád dál až do konce funkce main. Trošku zvláštní, jako kdyby všechny funkce byly inline.

 
Nahoru Odpovědět
5.3.2013 14:39
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:5.3.2013 14:41

Takže asi výsledek je nedefinovaný, protože různé implementace dopadnou různě.

Některý kompilátor může ten parametr předávat přes registr, jiný přes zásobník, některý kompilátor na stacku paměť kam ukazuje x podrží ještě do konce volající funkce, jiný ji třeba hned zahodí.

Nahoru Odpovědět
5.3.2013 14:41
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:5.3.2013 14:42

Ona takhle jednoduchá funkce se při optimalizacích inlinuje asi skoro vždy.

Nahoru Odpovědět
5.3.2013 14:42
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:5.3.2013 14:47

Pravda, u delší funkce by se to možná nestalo. U toho posunu stacku při deklaraci reference y mi ještě nedošlo, že kompilátor nejspíš data alokuje na stacku dřív než provádí ostatní kód funkce, takže se to už nikam neposouvá, ale to dost možná taky záleží na kompilátoru.

 
Nahoru Odpovědět
5.3.2013 14:47
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:5.3.2013 19:25

Btw. nemáś víc takových záludných otázek? Mohla by bejt nějaká zábava. :D

 
Nahoru Odpovědět
5.3.2013 19:25
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:5.3.2013 19:40

Na to jsem narazil náhodou na FB, když něco najdu, klidně to sem hodím :)

Nahoru Odpovědět
5.3.2013 19:40
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:5.3.2013 20:08

Mě napadla jedna. Je to spíš úloha než otázka.
Nasimulovat v C++ něco jako var. Tzn. vytvořit typ do kterýho de uložit cokoliv, a při změně a skončení platnosti se to správně dealokuje. Samozřejmě ten typ těžko pozná na co se konvertovat, takže se to musí vždycky konvertovat explicitně.
Nemá to asi žádný využití, ale řek bych že jako úloha to pro někoho může bejt dost zapeklitý. :D

 
Nahoru Odpovědět
5.3.2013 20:08
Avatar
Odpovídá na Lukáš Hruda
Luboš Běhounek Satik:5.3.2013 20:12

Nějaký inteligentnější void pointer by nestačil? :D

Nahoru Odpovědět
5.3.2013 20:12
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:5.3.2013 20:18

Tam jde právě o to, aby to nefungovalo jako odkaz, ale aby se do toho typu data zkopírovaly. Ale vevnitř to přes ten pointer funguje mno... :D

 
Nahoru Odpovědět
5.3.2013 20:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.