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ó.