Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Rakennerakenteiden Tasaus ja Täyte | Rakennerakenteiden ja Muistin Ymmärtäminen
C-Rakenteiden Hallinta

bookRakennerakenteiden 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

main.c

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

question mark

Miksi struct:in koko on usein suurempi kuin sen yksittäisten kenttien kokojen summa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 2

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

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?

bookRakennerakenteiden 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

main.c

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

question mark

Miksi struct:in koko on usein suurempi kuin sen yksittäisten kenttien kokojen summa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 2
some-alt