Hogyan számolhatjuk ki a sizeof (struct) értékét a C


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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük