Jak vypočítat hodnotu sizeof (struct) v C


Nejlepší odpověď

Přesná sekvence sizeof(struct) je chyba kompilace v C. Předpokládám, že se ptáte, jak určíte velikost konkrétního struct.

Tato odpověď není poskytována přímo v definici jazyka C. Je to spíše funkce ABI pro vaši konkrétní cílovou architekturu. (ABI znamená Application Binary Interface.)

Standard jazyka C stanoví některá obecná pravidla. Například pokud máte struct s více členy, první člen bude sdílet adresu se samotným struct a následující členové budou být na vyšších adresách.

Bitfields mají svou vlastní sadu pravidel. Nebudu je zde rekapitulovat.

U první objednávky bude velikost struct alespoň tak velký jako součet velikosti jeho členů (pro tuto chvíli bitová pole ignorujeme). Členové mohou mít omezení zarovnání, a pokud ano, prostředí může zavést odsazení mezi členy a odsazení na konci struct.

Zvažte následující struct na architektuře, která vyžaduje zarovnání 8 bajtů pro double hodnoty:

struct fun {

char a;

double b;

char c;

};

Podle pravidel jazyka C b musí být na vyšší adrese než a v každém případě struct fun. Podobně musí být c na vyšší adrese než b.

Výsledkem je, že tato konkrétní struktura pravděpodobně zabírá 24 bajtů, kvůli omezením zarovnání b na této architektuře. Stejná struktura může vyžadovat pouze 16 bajtů na architektuře, která vyžaduje pouze zarovnání 4 bajtů pro double.

Nevěřte mi?

Přesvědčte se sami:

Nakonec musíte konzultovat ABI vaší cílové platformy, abyste pochopili, jak struct se sbalí pro který cíl.

Nebo stačí použít sizeof pokud vás to osobně nezajímá, ale váš kód se o to musí starat.

Odpověď

Jak vypočítám hodnota sizeof (struct) v C?

Ne. Kompilátor to dělá.

Za prvé, sizeof(struct) je syntaktická chyba. Pravděpodobně se ptáte, jak určit velikost typu struktury nebo objektu takového typu. Je důležité být přesný. (Chápu, že odstranění podrobností otázek Quorou to ztěžuje.)

Řekněme, že máte typ struktury s názvem struct foo a / nebo objekt tohoto typu s názvem obj. Velikost typu je sizeof (struct foo) a velikost objektu (která je stejná jako velikost jeho typu) je sizeof foo . (Závorky jsou povinné v prvním případě, nikoli v druhém. Ve skutečnosti existují dvě různé formy operátoru sizeof. Jedna je použita pro název typu v závorkách, druhá pro název výraz, který je často, ale ne vždy, názvem objektu.)

Možná si myslíte, že můžete vypočítat velikost struktury sečtením velikostí jejích členů. Nemůžeš. Překladatelé mohou a mohou vkládat výplň mezi členy a případně za poslední člen, aby vyhověli požadavkům na zarovnání. Velikost struktury je alespoň součet velikostí jejích členů, ale pokud potřebujete velikost celé struktury, stačí použít sizeof. K tomu slouží.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *