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

bookRakennerakenteiden Muistiasettelun Ymmärtäminen

Muistirakenteet C-ohjelmointikielessä ovat keskeisessä asemassa ymmärrettäessä, miten data tallennetaan ja haetaan muistista. Kun rakenne määritellään C:ssä, kääntäjä päättää, miten sen jäsenet sijoitetaan muistiin kohdistus- ja täytesääntöjen perusteella.

Tässä on yleiskatsaus siihen, miten perusmuistinvaraus rakenteille toimii C:ssä:

main.c

main.c

copy
123456789101112131415
#include <stdio.h> // simple struct struct Test { char x; // 1 byte int y; // 4 bytes }; int main() { struct Test example; printf("Size of struct Test: %zu\n", sizeof(example)); printf("Address of example.x (char): %p\n", &example.x); printf("Address of example.y (int): %p\n", &example.y); return 0; }

Kuten odotettua, tällaisen rakenteen tulisi viedä 5 tavua: 1 tavu char x:lle, 4 tavua int y:lle, mutta todellisuudessa tämä vie 8 tavua.

Miksi rakenteen koko on paljon suurempi kuin odotimme?

Tämä johtuu siitä, että kääntäjä voi lisätä täyte-tavuja jäsenten väliin varmistaakseen, että jokainen jäsen alkaa osoitteesta, joka on monikerta sen koosta.

Kuvassa näet, että muistin ensimmäinen osa (vaaleampi alue) kuuluu muuttujalle char x, joka vie vain yhden tavun. Tämän jälkeen on kolme tyhjää tavua — tämä on täytettä, jonka kääntäjä lisää automaattisesti varmistaakseen, että seuraava alkio alkaa oikeasta osoitteesta. Täytteen jälkeen tallennetaan muuttuja int y, joka vie neljä tavua.

Tämän seurauksena rakenne vie yhteensä kahdeksan tavua: yksi char:lle, kolme tasausta varten ja neljä int:lle.

Tämä järjestely on olemassa, jotta prosessori voi käsitellä tietoa tehokkaammin. Ilman tasausta rakenteen jäsenten käsittely olisi hitaampaa ja ohjelma toimisi hitaammin.

question mark

Miksi sizeof(struct Test) palauttaa arvon 8 eikä 5?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 1

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Suggested prompts:

Can you explain more about alignment and why it's necessary?

Are there ways to reduce the size of a structure in C?

How does padding affect performance in real-world programs?

bookRakennerakenteiden Muistiasettelun Ymmärtäminen

Pyyhkäise näyttääksesi valikon

Muistirakenteet C-ohjelmointikielessä ovat keskeisessä asemassa ymmärrettäessä, miten data tallennetaan ja haetaan muistista. Kun rakenne määritellään C:ssä, kääntäjä päättää, miten sen jäsenet sijoitetaan muistiin kohdistus- ja täytesääntöjen perusteella.

Tässä on yleiskatsaus siihen, miten perusmuistinvaraus rakenteille toimii C:ssä:

main.c

main.c

copy
123456789101112131415
#include <stdio.h> // simple struct struct Test { char x; // 1 byte int y; // 4 bytes }; int main() { struct Test example; printf("Size of struct Test: %zu\n", sizeof(example)); printf("Address of example.x (char): %p\n", &example.x); printf("Address of example.y (int): %p\n", &example.y); return 0; }

Kuten odotettua, tällaisen rakenteen tulisi viedä 5 tavua: 1 tavu char x:lle, 4 tavua int y:lle, mutta todellisuudessa tämä vie 8 tavua.

Miksi rakenteen koko on paljon suurempi kuin odotimme?

Tämä johtuu siitä, että kääntäjä voi lisätä täyte-tavuja jäsenten väliin varmistaakseen, että jokainen jäsen alkaa osoitteesta, joka on monikerta sen koosta.

Kuvassa näet, että muistin ensimmäinen osa (vaaleampi alue) kuuluu muuttujalle char x, joka vie vain yhden tavun. Tämän jälkeen on kolme tyhjää tavua — tämä on täytettä, jonka kääntäjä lisää automaattisesti varmistaakseen, että seuraava alkio alkaa oikeasta osoitteesta. Täytteen jälkeen tallennetaan muuttuja int y, joka vie neljä tavua.

Tämän seurauksena rakenne vie yhteensä kahdeksan tavua: yksi char:lle, kolme tasausta varten ja neljä int:lle.

Tämä järjestely on olemassa, jotta prosessori voi käsitellä tietoa tehokkaammin. Ilman tasausta rakenteen jäsenten käsittely olisi hitaampaa ja ohjelma toimisi hitaammin.

question mark

Miksi sizeof(struct Test) palauttaa arvon 8 eikä 5?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 1
some-alt