Dynamická alokace zásobníku
                         -=-=-=-=-=-=-=-=-=-=-=-=-=-=-



                             How to program in "C"

      1] Use lots of global variables.
      2] Give them cryptic names such as: X27, a_gcl, or Horace.
      3] Put everything in one large .h file.
      4] Implement the entire project at once.
      5] Use macros and #defines to emulate Pascal.
      6] Assume the compiler  takes  care of all the  little  details  you
         didn't quite understand.

          "It's 5:50 a.m., Do you know where your stack pointer is?"

          V  klasickém  C  je  zásobník  učen   výhradně  pro  automatické
      proměnné, které mají předem danou velikost. Vlastní pojetí zásobníku
      ale nijak  nebrání ani  alokacím  proměnné  délky.  GNU C (a některé
      další překladače C) rozšiřuje syntax C o možnost dát polím proměnnou
      délku.

          I tento  přístup  je  často  poněkud  těžkopádný  a navíc  úplně
      nepřenositelný na platformy bez GNU C. Užitečné je i další rozšíření
      jazyka C - alloca.  To  je  "funkce",  která  funguje  podobně  jako
      malloc, ale alokuje  data na zásobníku.  Blok se automaticky  uvolní
      na konci  funkce.  Není  tedy  nutné se starat o volání  free.  Tato
      vlastnost  je  velmi  praktická  - i v případě,  že  funkce  spadne,
      nebo  použije  longjmp  (případně  jej  použije  nějaká  funkce z ní
      volaná), paměť se spolehlivě  uvolní. Je tedy velmi těžké zapomenout
      neuvolněný blok.

          Další jednoznačnou  výhodou alloca je jeho rychlost a úspornost.
      GNU C má alloca  implementovanou jako builtin do překladače a alloca
      se tedy nepřekládá  jako volání  funkce.  Navíc na zásobníku  nemůže
      vzniknout  fragmentace a tak blok zabírá  přesně tolik paměti, kolik
      má.

          Nevýhody  alloca jsou zejména v jeho nepřenositelnosti.  Situace
      sice není tak špatná - mnoho  ne-GNU  systémů  alloca  implementuje.
      Manuálová stránka se o přenositelnosti alloca vyjadřuje takto:

          There is evidence that the alloca function appeared in 32v, pwb,
      pwb.2, 3bsd, and 4bsd.  There is a man page for it in BSD 4.3. Linux
      uses the GNU version.

          Existuje  i public-domain  implementace  alloca  jako C  funkce.
      Mnoho libc na různých platformách funkci už obsahuje a zdrojové kódy
      jsou distribuovány například společně s GCC. Tato funkce ale funguje
      poněkud  jinak.  Alokuje bloky na haldě a při každém  volání  projde
      všechny  bloky a zjistí,  jestli  funkce,  která  blok  vytvořila už
      zkončila. Proto je při použití  alloca  vhodné použít někde v hlavní
      smyčce alloca(0) a vyvolat tak garbage-collection.

          Program v UNIXu běžně nemá prostředky na zjištění  volného místa
      na  zásobníku.  Proto v případě, že je plná  paměť,  program  spadne
      podobně jako při nekonečné rekursi. Narozdíl od mallocu, alloca tedy
      nevrátí NULL  (přesto, že to manuálová  stránka o něm tvrdí). Tak se
      chová  pouze jeho  knihovní  implementace. V DJGPP je situace  navíc
      komplikována  tím, že zásobník má omezenou  velikost a standardně je
      poměrně malý a proto je nutné si dát pozor na přetečení.


            výheň