Kuinka laskea sizeof (struct) -arvo C: ssä


Paras vastaus

Tarkka sekvenssi sizeof(struct) on käännösvirhe Oletan, että kysyt, kuinka määrität tietyn struct koon.

Tätä vastausta ei tarjoa suoraan C-kielen määritelmä. Pikemminkin se on ABI: n tehtävä kohteesi arkkitehtuurille. (ABI tarkoittaa Application Binary Interface.)

C-kielistandardi asettaa joitain laajoja sääntöjä. Esimerkiksi, jos sinulla on struct, jossa on useita jäseniä, ensimmäinen jäsen jakaa osoitteen itse struct: n kanssa ja seuraavat jäsenet olla korkeammissa osoitteissa.

Bittikentillä on omat säännöt. En kerro niitä täällä.

Ensimmäiseen järjestykseen struct -koko on ainakin yhtä suuri kuin sen jäsenten koon summa (jättämällä tällä hetkellä huomioimatta bittikentät). Jäsenillä voi olla kohdistusrajoituksia, ja jos on, ympäristö voi ottaa käyttöön pehmusteen jäsenten välillä ja pehmusteen struct: n lopussa.

Harkitse seuraavaa struct arkkitehtuurilla, joka vaatii 8-tavun tasauksen double -arvoille:

struct fun {

char a;

double b;

char c;

};

C-kielen sääntöjen mukaan b on oltava korkeammalla osoitteella kuin a missä tahansa struct fun -esimerkissä. Samoin c on oltava korkeammassa osoitteessa kuin b.

Tämän seurauksena tämä tietty rakenne todennäköisesti käyttää 24 tavua, johtuen b -suunnittelurajoituksista kyseisessä arkkitehtuurissa. Sama rakenne saattaa edellyttää vain 16 tavua arkkitehtuurilla, joka vaatii vain 4 tavun tasauksen double.

Etkö usko minua?

Katso itse:

Viime kädessä sinun on kysyttävä kohdealustasi ABI: sta ymmärtämään, miten struct pakataan yhteen kohteelle että kohde.

Tai käytä vain sizeof jos et itse välitä siitä, mutta koodisi on huolehdittava.

Vastaa

Kuinka lasken arvo sizeof (struct) C: ssä?

Et. Kääntäjä tekee.

Ensinnäkin, sizeof(struct) on syntaksivirhe. Kysyt todennäköisesti, kuinka määritetään rakennetyypin tai tällaisen kohteen koko. On tärkeää olla tarkka. (Ymmärrän, että Quoran kysymystietojen poistaminen vaikeuttaa sitä.)

Oletetaan, että sinulla on rakennetyyppi nimeltä struct foo ja / tai tämän tyyppinen objekti nimeltä obj. Tyypin koko on sizeof (struct foo) ja objektin koko (joka on samanlainen kuin sen tyypin koko) on sizeof foo . (Sulkeet vaaditaan ensimmäisessä tapauksessa, eivät toisessa. sizeof -operaattorilla on itse asiassa kaksi erilaista muotoa. Yksi käytetään sulkeissa olevaan tyyppinimeen, toinen lauseke, joka on usein mutta ei aina objektin nimi.)

Saatat ajatella, että voit laskea rakenteen koon lisäämällä sen jäsenten koot. Et voi. Kääntäjät voivat tehdä ja tehdä lisäpehmusteen jäsenten väliin ja mahdollisesti viimeisen jäsenen jälkeen tasausvaatimusten täyttämiseksi. Rakenteen koko on ainakin sen jäsenten koon summa, mutta jos tarvitset koko rakenteen kokoa, käytä vain sizeof. Sitä varten se on.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *