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

Rakennerakenteiden Kohdistus ja Täydennys

Pyyhkäise näyttääksesi valikon

Kohdistus

Jokainen rakenteen kenttä kohdistetaan rajalle, joka on rakenteen suurimman alkion koon monikerta.

Esimerkiksi, jos suurin alkio on kooltaan 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

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 rajalle, joka on 8 tavua. Ensisilmäyksellä kaikkien kolmen kentän kohdistaminen 8 tavun rajalle voisi viitata 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 rajalla, kääntäjä lisää 3 tavun täytteen a:n jälkeen. Kenttä b vie 4 tavua ja on nyt oikein kohdattu.

Seuraava kenttä c on double ja sen tulee alkaa 8 tavun rajalla. 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 muistin käyttö on tehokasta.

question mark

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

Valitse oikea vastaus

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

Rakennerakenteiden Kohdistus ja Täydennys

Kohdistus

Jokainen rakenteen kenttä kohdistetaan rajalle, joka on rakenteen suurimman alkion koon monikerta.

Esimerkiksi, jos suurin alkio on kooltaan 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

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 rajalle, joka on 8 tavua. Ensisilmäyksellä kaikkien kolmen kentän kohdistaminen 8 tavun rajalle voisi viitata 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 rajalla, kääntäjä lisää 3 tavun täytteen a:n jälkeen. Kenttä b vie 4 tavua ja on nyt oikein kohdattu.

Seuraava kenttä c on double ja sen tulee alkaa 8 tavun rajalla. 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 muistin käyttö on tehokasta.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 2
some-alt