Legjobb válasz
A sizeof(struct) pontos sorrend fordítási hiba feltételezem, hogy azt kérdezi, hogyan határozza meg egy adott struct méretét.
Ezt a választ nem a C nyelv definíciója adja közvetlenül. Inkább az ABI függvénye az adott célarchitektúrához. (Az ABI az Application Binary Interface rövidítést jelenti.)
A C nyelvi szabvány néhány átfogó szabályt tartalmaz. Például, ha van egy struct tagunk több taggal, akkor az első tag megosztja a címét magával az struct vel, a következő tagok pedig legyen magasabb címeken.
A bitmezők saját szabályokkal rendelkeznek. Nem foglom ezeket itt összefoglalni.
Első sorrendben a struct mérete legalább akkora, mint a tagok méretének összege (a bitmezőket pillanatnyilag figyelmen kívül hagyva). A tagoknak lehetnek összehangolási korlátai, és ha mégis, akkor a környezet bevezetheti a tagok közötti párnázást és az struct végén található párnázatot.
Vegye figyelembe a következő struct egy olyan architektúrán, amely 8 bájtos igazítást igényel az double értékekhez:
struct fun {
char a;
double b;
char c;
};
A C nyelv szabályai szerint címnek magasabbnak kell lennie, mint a a, az struct fun bármelyik esetben. Hasonlóképpen, a c címnek magasabbnak kell lennie, mint a b.
Ennek eredményeként ez a bizonyos szerkezet valószínűleg elfoglalja 24 bájt, az b igazítási korlátok miatt az adott architektúrán. Ugyanez a struktúra csak 16 bájtot igényelhet egy olyan architektúrán, amely csak 4 bájtos igazítást igényel a double számára.
Nem hiszel nekem?
Nézze meg Ön is:
Végül konzultálnia kell a célplatform ABI-jével, hogy megértse, hogyan lehet egy struct össze lesz csomagolva a célhoz .
Vagy használja a következőt: sizeof ha személy szerint nem érdekli, de a kódjának törődnie kell vele.
Válasz
Hogyan számoljam ki a sizeof (struct) értéke C-ben?
Nem. A fordító igen.
Először is, a sizeof(struct) egy szintaktikai hiba. Valószínűleg azt kérdezi, hogyan lehet meghatározni egy szerkezettípus vagy egy ilyen típusú objektum méretét. Fontos, hogy pontos legyünk. (Tudomásul veszem, hogy ezt a Quora a kérdés részleteinek eltávolítása megnehezíti.)
Tegyük fel, hogy van egy struct foo nevű szerkezettípus és / vagy egy ilyen típusú objektum obj. A típus mérete sizeof (struct foo), és az objektum mérete (amely megegyezik a típusának méretével) sizeof foo . (A zárójelekre az első esetben van szükség, a másodikra nem. A sizeof operátornak valójában két különböző formája van. Az egyiket zárójeles típusnévre, a másikat egy kifejezés, amely gyakran, de nem mindig objektum név.)
Gondolhatja, hogy kiszámíthatja a struktúra méretét a tagok méretének összeadásával. Nem lehet. A fordítók beilleszthetnek és tehetnek betétet a tagok közé, és esetleg az utolsó tag után, hogy megfeleljenek az igazítási követelményeknek. A struktúra mérete legalább a tagok méretének összege, de ha a teljes szerkezet méretére van szüksége, akkor egyszerűen használja a sizeof. Erre való.