Diskuze: Zajímavá záludná otázka :)
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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ě.
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.
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
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.
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.
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.
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í.
Ona takhle jednoduchá funkce se při optimalizacích inlinuje asi skoro vždy.
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.
Btw. nemáś víc takových záludných otázek? Mohla by bejt nějaká
zábava.
Na to jsem narazil náhodou na FB, když něco najdu, klidně to sem hodím
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ý.
Nějaký inteligentnější void pointer by nestačil?
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...
Zobrazeno 15 zpráv z 15.