Rakennerakenteiden Tasaus ja Täyte
Pyyhkäise näyttääksesi valikon
Kohdistus
Jokainen rakenteen kenttä kohdistetaan rajalle, joka on rakenteen suurimman alkion koon monikerta.
Esimerkiksi, jos suurin alkio on 4 tavua, jokainen alkio kohdistetaan 4 tavun rajalle.
Tämä tehdään muistinkäytön nopeuttamiseksi ja laitteistotason kohdistusongelmien välttämiseksi.
main.c
1234567891011121314151617181920#include <stdio.h> // simple struct struct Example { char a; int b; double c; }; int main() { struct Example test; printf("Size of struct Example: %zu\n", sizeof(test)); printf("Address of test.x (char): %p\n", &test.a); printf("Address of test.y (int): %p\n", &test.b); printf("Address of test.c (double): %p\n", &test.c); return 0; }
Saatat ihmetellä, miksi struct Example-rakenteen koko on 16 tavua, vaikka jokainen kenttä kohdistetaan suurimman tyypin, eli 8 tavun, rajalle. Ensisilmäyksellä voisi ajatella, että kaikkien kolmen kentän kohdistaminen 8 tavun rajalle johtaisi kokonaiskokoon 24 tavua. Todellisuudessa asia toimii hieman eri tavalla.
Ensimmäinen kenttä a on char ja vie 1 tavun. Jotta seuraava kenttä b, joka on tyyppiä int, alkaisi 4 tavun rajakohdasta, kääntäjä lisää 3 tavun täytteen a:n jälkeen. Kenttä b vie itsessään 4 tavua ja on nyt oikein kohdattu.
Seuraava kenttä c on double ja sen tulee alkaa 8 tavun rajakohdasta. Kääntäjä lisää täytettä b:n jälkeen, jotta c sijoittuu oikeaan osoitteeseen. Kenttä c vie 8 tavua.
Yhteensä: 1 tavu a:lle + 3 tavua täytettä + 4 tavua b:lle + 8 tavua c:lle = 16 tavua. Kohdistussäännöt täyttyvät ja muisti käytetään tehokkaasti.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme