C++ / stack / heap – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C++ / stack / heap – C / C++ – Fórum – Programujte.comC++ / stack / heap – C / C++ – Fórum – Programujte.com

 

frank0
Duch
6. 10. 2019   #1
-
0
-

   

Venujem sa nejaké 2 týždne C++ ale stále v ňom tápem. Dlho som programoval vo vyšších jazykoch.

C++ mi dáva veľa slobody veľa možností ako niečo spraviť a práve v tom je ten problém. 

1. Už len taká alokácia premenných (idem to porovnať s vyššími jazykmi):

C# - sa "primitívne" základné typy (int, float, int64, bool) vytvárajú na stacku. Objekty sú vytvárané na halde. Štruktúry na stacku. Všetko čo sa vytvára na stacku je hodnotové. Všetko čo sa vytvára na halde je referenčné (upozornenie: refrencie v C# je niečo iné ako referencie v C++). čo sa týka stringov tie sa vytvárajú (aj tam aj tam) podľa kontextu. 

C++ sa dá hocičo vytvoriť hocikde. No a teraz babo raď kde mám čo vytvoriť?

Mám to robiť rovnako ako v C#? Že objekty budem vytvárať primárne na halde? A budem k ním pristupovať cez pointery (resp smart pointery aby sa nemuselo riešiť uvolňovanie pamate)? A len vo výnimočných prípadoch ich vytvorím na stacku (keď to budú vyžadovať okolnosti)? Alebo mám naopak preferovať vytváranie na stacku? Viem že OOP na stacku je obmedzené nefungujú tam virtuálne metódy.

Ale mňa zaujíma hlavne to čo je efektívnejšie a čo sa ako bežne používa. Keď si pozriem nejaké príklady tak sa používajú obidva spôsoby rovnako veľa. Podľa akého kľúća si mám teda vyberať medzi stackom a haldou. 

2. stringy
	
C# - string je objekt ale správa sa ako keby to bol primitívny typ (je immutable a má preťažený operátor = takže sa vždy kopíruje jeho hodnota). Človek vôbec nerieši kde ten string vytvorí.

C++ std::string / std::wstring - je tiež objekt ale môžem si ho vytvoriť kde chem, kde mám preferovať jeho vytváranie na stacku či na halde? aké výhody prináša jedna aj druhá vraianta?

3. to isté platí pre kontainery ako vector či map - stack alebo halda?

4. polia? - stack alebo halda?

5. a čo ak chcem mať anemický objekt (kôli jednoduchšej serializácii?) ten asi treba celý vytvoriť na stacku.

viete mi povedať podľa čoho sa mám rozhodovať? 

6. Ešte sa opýtam an GUI. Aký GUI toolkit preferujete? pre C++? Qt?

Na záver ešte poviem že C++ sa mi veľmi páči konečne jazyk ktorý si ide svojou cestou a nekopíruje ostatné jazyky. Programujem už veľmi dlho od základnej školy (desiatky rokov) ale C++ je pod dlhej dobe prvý jazyk ktorý ma dokáže stale znovu a znovu prekvapiť. Vačšina  imperatívnych jazykov sú všetky na jedno kopyto.
Nahlásit jako SPAM
IP: 84.47.1.–
KIIV
~ Moderátor
+43
God of flame
6. 10. 2019   #2
-
0
-

1. Jestli na stacku nebo v heapu je vetsinou zalezitost nekolika veci:

  • znas velikost predem?
  • neni to moc velke aby se to veslo do stacku (podle systemu ma vetsinou jen par MB, takze obrovske pole na stacku proste neprojde)
  • je to nejaky chytry objekt (takovy se vytvari prave na stacku, aby se pri skonceni platnosti zavolal destruktor)
  • jestli se ma pak objekt jeste nekam dal predavat

1. + 2. + 3. Je taky dobre vedet, ze naprosta vetsina kontejneru jako (vector, jeho varianta string, ...) si pamet osefuji sami, takze stejne ty data skonci na heapu, ikdyz je string lokalni promenna (na stacku). Ruzne implementace muzou mit i vylepseni, jako ze pokud je string alespon o 1 kratsi nez je velikost pointeru, tak ulozi data primo v sobe.

Takze prakticky neni potreba vytvaret je na heapu. Hlavne se pote samy uvolni destruktorem (samozrejme, pokud v nich mas raw pointery, tak o nich to uz neplati, jedine, pokud tam bude nejaky smart wrapper, ktery by se o to postaral)

Virtualni metody na stacku nefungujou, protoze je pevne dane, ze je to konkretni typ. Nemuzes tam nikdy nacpat nic jinyho. Nicmene muzes vytvorit referenci (ci ziskat pointer) a ten pak predavat i referenci na nadrazene tridy (jeho parenty). Tj.   Child obj; Parent & reference = obj;  a nad "reference" uz polymorfizmus fungovat bude. To se nejvice pouziva pri predavani parametru pomoci rozhrani (interface)

4. pole na stacku (pokud se tedy do nej vejdou a vubec jestli znas velikost)

5. Jedine ciste C struktury - a jen POD polozky (plain old data - tj. nic z C++), ale nedoporucuju. Kazdej prekladac a i jeho varianty si to zarovnaj v pameti jak se jim zlibi a tak. Kazdopadne ta struktura nemusi byt nutne na stacku, musi byt akorat v pameti na jednom miste

6. Ja osobne mam rad automatizaci a tak, takze spis textove, neinteraktivni a ovladani scriptama. V praci se treba na 3D grafiku pouziva openFrameworks (ale je to dost patlanina, samej navrhovej antipattern) a hlavne tam neni poradne nic na normalni okynka a formulare.

Jinak vetsina jazyku v nejakem smyslu kopiruje C ci C++ (C je mimochodem hodne starej jazyk) a C++ vzniklo puvodne jako nadstavba C a pote se z nej stal samostatny jazyk. Urcite je lepsi nemichat C do C++ programu (pokud to jde, coz vetsinou ano)

Nahlásit jako SPAM
IP: 62.24.80.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 22 hostů

Podobná vlákna

Corruption of the heap — založil Scrat

Zvětšení java Heap — založil Honza

Error: Java Heap Space — založil wannabewebguy

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý