Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C# - uložení struktrury v paměti

Přečetl jsem si už spoustu článků, knih atd. Musím říct, že každý autor má jinou terminologii při rozlišení typů v jazyku C#. Jedni dělí typy na hodnotové a referenční podle toho zda jsou uloženy v zásobníku a haldě. Druzí je dělí na primitivní, objektové, referenční a všechno se motá dohromady. Jedno vím jistě, že vše je v C# objekt. Tzn., že když vytvořím novou proměnnou s klíčovým slovem struct, jedná se vlastně o "odkaz" na objekt, přičemž ten objekt není uložený v haldě, ale v zásobníku spolu i s tím odkazem. Je to tak opravdu uspořádáno v paměti?

Předmět Autor Datum
Struktury jsou v zásobníku, ostatní v haldě.
Wikan 04.12.2011 12:26
Wikan
To vim... jde mi o tu promennou, ktera ukazuje na objekt typu struktura. Mam Struct s = new Struct()…
Jirka800 04.12.2011 12:30
Jirka800
premenna s nepredstavuje nic len jedno pismeno ktore prekladacu povie ze co od neho zrovna chces. Ak…
MM.. 04.12.2011 12:34
MM..
... resp. v C# je to trochu zlozitejsie (to s tym ak new tak halda sa da aplikovat na C++), pre C# s…
MM.. 04.12.2011 12:39
MM..
... tak nakoniec to s tym new plati aj pre C# (nebol som si isty nerobim profesionalne v C#) ale je…
MM.. 04.12.2011 12:47
MM..
Pokud použije new na struct, tak je to pořád ve stacku.
Wikan 04.12.2011 12:51
Wikan
Ok mas pravdu (MSDN is the best :) http://msdn.microsoft.com/en-us/library/aa288471%2 8v=vs.71%29.as…
MM.. 04.12.2011 13:13
MM..
resp. neni to jedno pri predavani parametra, struktura sa predava hodnotou a nie pointrom, grr, iba… poslední
MM.. 04.12.2011 13:19
MM..
Struktura je hodnotový typ, takže tam žádná reference není. V proměnné jsou přímo uložené hodnoty.
Wikan 04.12.2011 12:37
Wikan
ne. Za prve vobec sa tym nemusis zaoberat kde to je, je to vec prekladaca, teba zaujima viditelnost…
MM.. 04.12.2011 12:32
MM..

... resp. v C# je to trochu zlozitejsie (to s tym ak new tak halda sa da aplikovat na C++), pre C# si kukni napr. http://www.c-sharpcorner.com/UploadFile/rmcochran/ csharp_memory01122006130034PM/csharp_memory.aspx?A rticleID=9adb0e3c-b3f6-40b5-98b5-413b6d348b91

Here are our two golden rules:

A Reference Type always goes on the Heap - easy enough, right?

Value Types and Pointers always go where they were declared. This is a little more complex and needs a bit more understanding of how the Stack works to figure out where "things" are declared.

idealne precitat si to cele ak tomu chces aj rozumiet.

ne.
Za prve vobec sa tym nemusis zaoberat kde to je, je to vec prekladaca, teba zaujima viditelnost (dkial na to mozes pristupovat) a zivotnost (kedy sa ten obsah strati a ci to musis sam dealokovat).
Lokalne premenne dava prekladac do stacku ptz to je rychlejsie a po ukonceni fcie sa teda zrusia (zneplatnia), neni to ali nikde uzakonene ze to prekladac tak robit musi, pre teba je dolezite ze lokalna premenna po ukonceni fcie neexistuje a akykovek pristup cez nejaky pointer na nu po ukonceni fcie bude znamenat "program proved neplatnou operaci" alebo poskodis ine data programu.
Globalne a staticke premenne dava prekladac do datoveho segmentu programu, a pri pouziti new alebo inych alokacnych funkcii sa alokuje pamat od OS, t.j. ta "halda". Tie musis sam dealokovat ak ich nepotrebujes aby tvoj program nezozral vsetku RAM.

Zabudni na nazvy, nikde neni uzakonene jak sa to nazyva, ja si to mozem nazvat lokalna a globalna a alokovana :D Bud chapes zmysel a rozdiely alebo nechapes.

Zpět do poradny Odpovědět na původní otázku Nahoru