Přejít na obsah

Stack/heap size warning [*****]

stack dynamic heap header code warning 16384 hotdog

  • Pokud chcete odpovědět, přihlaste se
2 odpovědí

#1
Tanga

Tanga

    Old Reece

  • Uživatel
  • Příspěvků: 1 035
  • Je tu celkem: 27d 20h 47m 17s

Obtížnost: :5:

 

Budem to nazývať tut, ale je to skôr opravenie chyby, ale téma "ako opraviť chybu" tu nie je :d.
Tento tut je o matike a je pre skúsenejších programátorov, alebo pre niekoho s "warningom" podla obrázka.
Spoznať to môžete takto (obrázok):

Spoiler

V prípade, že obrázok vymazal hosting, je tam (text):
Spoiler

(Čísla tam môžete mať rôzne, ale tento text je velmi špecifický a inde ho vidieť nemôžete, takže ak sa vám to stalo, tak toto je určite ono.)

Čo je to za text

  • Určite viete, že počítače majú rôzne typy pamätí.. HDD, RAM, ... A každý program s touto pamäťou nejako pracuje. Tak, ako program môže pracovať s pamäťou RAM, tak môže pracovať aj s pamäťou typu register (ak nepoznáš nevadí), heap (slovenský preklad kôpka? :d), a tak isto môže používať aj pamäť zásobník. Tento text zobrazuje stav rôznych pamätí. 

Zásobník - stack

  • Zásobník je pamäť, ktorá je automaticky riadená (nemusíte riešiť pridelovanie, uvolňovanie, ...), do nej sa ukladajú bežné premenné. Pri vytvorení premennej si program automaticky pamäť priradí a pri ukončení funkcie zasa pamäť uvolní. Tento typ pamäte je najrýchlejší. Táto pamäť má však limit - nie je možné vytvoriť premennú o velkosti 500 MB, aj keď máte volných 500MB v RAM. To všetko kvôli tomu, že kvôli optimalizácii pamäti zásobník systém nevie určiť, že kolko pamäte budete potrebovať a kedy.. Tak skrátka tam dal limit. Tento limit je rôzny, závisí od operačných systémov. Pozorného a vzdelaného čitateľa mohlo napadnúť, že ako teda môže aj Linux aj Windows používať samp server, keď by tam bol teoreticky zásobník inej velkosti? Tu ide o to, že PAWN nie je štandardný jazyk. Vytvára súbory AMX (Abstract Machine eXecutable), ktoré nie sú závislé od operačného systému. Toto všetko riadi "prekladač" - pawncc.exe, pričom minimum stack pamäte je 16kB (default), viac na túto tematiku nájdete v dokumentácii o PAWN, toto bola len zaujímavosť, ale ešte sa k tomu dostanem aj neskôr.
  • Takže všetky premenné, ktoré máte vo vašom programe by dokopy nemali mať viac než 16kB. Ak neviete, tak pawn je 32bitový jazyk (môže byť viac i menej). Nepozná nič ako dátové typy, premenné sa ukladajú do buniek o velkosti 32 bitov.Takže do takejto premennej je možné uložiť jeden znak UNICODE alebo štyri znaky ASCII (Jeden znak ascii má 8 bitov). Keďže my používame UNICODE, tak možnosť šetriť priestorom tu neexistuje (aj keď pawn to umožňuje, tzv. packed stringy).Pawn využíva pre každú premennú 4 bajtové "ohrádky", známe aj z windowsu, ktoré majú myslím, že 16 buniek.
new test0; /* zabera 4 bajty */
new test1[3]; /* zabera 12 bajtov */
new test2[4]; /* zabera 16 bajtov */

 

16 kB, tiež známych ako 16 384 bajtov je maximum pamäte zásobníku.*Dá sa obísť, čítaj ďalej..
To znamená, že všetky naše stringy musíme potlačiť tak, aby nebolo naraz staticky alokovaných viac než 16 kB.
Tento warning, o ktorom je reč (že zásobník zaberá viac pamäte než môže) si experimentálne môžeme jednoducho zobraziť.
Museli by sme iba zabrať 16 kilobajtov v zásobníku, čiže staticky alokovať pole o velkosti 4096 buniek.
Pri prázdnom kóde (len funkcia main) to však nie je potrebné. 
Hlavičkový súbor zaberá 88 bajtov a kód 60 bajtov, takže stačí zabrať 16384 - 88 - 60 bajtov. 
Tieto bajty jednoducho rozdelíme po 32 bitov, alebo po štyri bajty a získame 4059.

main() {
  new kravina[4059]; /* tu nam to pri kompilacii hodi "error" */
}

Prečo mi táto vec nedá error

  • To vysvetliť neviem. Rozhodne to chyba je. Môžete si to overiť a to tak, že si vytvoríte kód, kde použijete viac premenných a budete ich prepisovať rôznymi spôsobmi. Po chvíli server možno crashne, pretože bude prepisovať premenné na divné hodnoty, aj tie, čo mu nepatria. Ak server necrashne vytvorí to kopu frustrácie, pretože to náhodne bude hádzať hodnoty ostatným premenným a nebude sa to dať nájsť.

Ako to opraviť

  • Najrozumnejšie bude zoptimalizovať kód - odstrániť 256 bajtové stringy, nepotrebné kraviny a všetko bude fungovať. Sú gamemody rátajúc 100 000 riadkov, ktoré tento limit neprekračujú, prečo by mal váš hobby skript prekračovať?

Prípad, že nemôžem optimalizovať viac

  • Direktíva preprocesoru pragma dynamic určuje kolko pamäte bude skript používať. Zväčšíte to jednoducho pomocou
  • Používajte to len v prípade, že sa to nedá viac optimalizovať. Autori tam nedali ten limit zo srandy.
#pragma dynamic 17000 /* velkost pamate v bajtoch */

Môže obsahovať kraviny :d.

 

[success='Ověřený návod']Tento návod prošel validací, a lze ho proto považovat za ověřený.[/success]


  • 0


17362453_10155338184568646_9182008623158


#2
TheKid

TheKid

    AW Clan Member

  • Uživatel
  • Příspěvků: 782
  • Je tu celkem: 55s
Jojo to se mi stalo.Kod pak neni dal aplikovan - jako by nebyl
  • 0

Dělám hudbu. A nebo aspoň něco hudbě podobnýho.

 

♦ SoundCloud: https://soundcloud.com/arzim/

♦ Youtube: https://www.youtube....FubFyXVh8ZyMcRw

 


#3
Mattsy

Mattsy

    Rovinky jsou pro rychlá auta. Zatáčky jsou pro rychlé jezdce

  • Uživatel
  • Příspěvků: 3 283
  • Je tu celkem: 1h 40m 46s
Mne sa to stalo dnes, kvoli tomu napisal tento topic, ale mod mi isiel skompilovat aj spustit bez problemov, aj script ktory mi to robil fungoval ale ze vraj by to po case blblo tak som ten script odstranil...ja som sa na to este pozeral potom a planujem k tomu urobit rozsirenejsi navod, vvyborne sa cez to optimilizuje GM.
  • 0

!!! NIE SOM MATESSS A NEMÁM SHOOTER !!!

SVK_Mattsy.png
4e79071dddeb7643ddf3a57f06616a26.png






Také označeno jedním nebo více klíčovými slovy: Návod, stack, dynamic, heap, header, code, warning, 16384, hotdog

0 uživatelů si prohlíží toto fórum

0 uživatelů, 0 návštěvníků 0 anonymních uživatelů

© 2015 IPS, Inc.

Zajímat Vás mohou ještě aktuální zprávy. sleviště, slevy dnes Herbalife je skvělou cestou pro dobré zdraví. Je libo dětský web?