Struktury a data na disku
                          -=-=-=-=-=-=-=-=-=-=-=-=-=-

               The world is coming to an end--save your buffers!

          Protože jsou typy jinak dlouhé, má to logicky  dopad na velikost
      struktur,  které se často  ukládají na disk.  Soubory  uložené kódem
      z jednoho  překladače  pak  nenačtete  kódem z  druhého.  Navíc  ale
      GCC  struktury  zarovnává. Od 486 se pro 32 bitové  hodnoty  uložené
      na adresách  dělitelných 4 použije 32 bitový  přístup. Pokud  adresy
      dělitelné nejsou,  použije se pomalejší  přístup. Proto se GCC snaží
      všechny 32 bitové  hodnoty držet na adresách  dělitelných  číslem 4,
      a 16ti bitové hodnoty na adresách dělitelných číslem 2.

          Protože ale norma  nedovoluje  přeházet  položky ve strukturách,
      GCC  prostě  před  každou   položku  přidá  volné   místo  tak,  aby
      adresa  byla  správně  dělitelná v  případě,  že  začátek  struktury
      leží na adrese  dělitelné 4. Aby toto bylo  zaručeno,  zvětší  ještě
      strukturu tak, aby její celková  velikost byla násobek 4, aby i pole
      struktur  bylo  správně  zarovnané. Aby i začátky  pole byly správně
      zarovnané, i funkce pro alokaci  paměti  (malloc atd.)  vrací adresy
      dělitelné 4. Díky tomu například struktura:

      struct {
              char a;
              char b;
              int c;
      };

          má  velikost 8. A se uloží na  začátek, b hned za něj.  Potom se
      dva bajty  vynechají, aby byla adresa c dělitelná 4 a pak se uloží 4
      bajtová hodnota C. Struktura je tedy stejná, jako:

      struct {
              char a;
              char b;
              short unused;
              int c;
      };

      Naopak ale struktura:

      struct {
              char a;
              int c;
              char b;
      };

          zabírá  celých 12 bajtů,  protože za prvním  charem se vynechají
      3 bajty pro  zarovnání  intu, a za posledním  další 3 pro  zarovnání
      velikosti  struktury.  Proto je ve strukturách  dobré  řadit položky
      podle velikosti. Ušetří se tím nějaké místo v paměti.

          Pokud tuto funkci  potřebujete  vypnout - potřebujete  strukturu
      načítat z disku  tak, aby  sedla se starou,  nebo se bavit s vnejším
      světem, je nutné nastavit atribut packed:

      struct {
              char a;
              int c;
              char b;
      } __attribute__ ((packed));

          Tato  struktura má potom  velikost 6. Navíc  lze  tento  atribut
      použít  uprostřed  struktury,  pokud je  třeba  pouze  nějaký  prvek
      "připlácnout" hned za předchozí:

      struct {
              char a;
              int c __attribute__ ((packed));
              char b;
      }

          Toto  zarovnávání lze také určovat  explicitně  pomocí  atributu
      aligned:

      struct {
              char a;
              int c __attribute__ ((aligned (16)));
              char b;
      }

          Tady se int  zarovná na 16  bajtů  (stejně  jako  velikost  celé
      struktury, aby to platilo i v poli). Velikost struktury tedy bude 32.

          Tyto  atributy lze používat i na normální  proměné,  pokud to je
      třeba.


            výheň