Rakennerakenteiden Tasaus ja Täyte
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
Can you explain why the struct isn't 24 bytes if the largest element is 8 bytes?
How does padding work in structs with different data types?
Can you show an example of how the memory layout looks for this struct?
Mahtavaa!
Completion arvosana parantunut arvoon 4.35
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!