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?
Struktury jsou v zásobníku, ostatní v haldě.
To vim... jde mi o tu promennou, ktera ukazuje na objekt typu struktura. Mam Struct s = new Struct()... jde mi o, jestli promenna "s" predstavuje adresu (odkaz) na objekt, ktery je ulozen v zasobniku.
premenna s nepredstavuje nic len jedno pismeno ktore prekladacu povie ze co od neho zrovna chces.
Ak pouzivas new, tak sa to alokuje dynamicky od OS, t.j. z tej tvojej "haldy"
... 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
idealne precitat si to cele ak tomu chces aj rozumiet.
... tak nakoniec to s tym new plati aj pre C# (nebol som si isty nerobim profesionalne v C#) ale je to logicke, ak pouzijes new, tak to ide z haldy t.j. s je pointer. Ak nepouzijes new a je to hodnotovy typ, tak to je v stacku.
Pokud použije new na struct, tak je to pořád ve stacku.
Ok mas pravdu (MSDN is the best :)
http://msdn.microsoft.com/en-us/library/aa288471%2 8v=vs.71%29.aspx
v C# to zoptimalizovali. V principe je to ale programatorovi jedno.
resp. neni to jedno pri predavani parametra, struktura sa predava hodnotou a nie pointrom, grr, iba som ho uplne zblbol, OK uz radsej k C# nic nepisem, je to riadny maglajz, zlate C++ :)
Struktura je hodnotový typ, takže tam žádná reference není. V proměnné jsou přímo uložené hodnoty.
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.