Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Allineamento e Padding nelle Struct | Comprendere Struct e Memoria
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Padronanza delle Struct in C

bookAllineamento e Padding nelle Struct

Allineamento

Ogni campo di una struttura è allineato a un confine che è un multiplo della dimensione dell'elemento più grande della struttura.

Ad esempio, se l'elemento più grande ha una dimensione di 4 byte, allora ogni elemento sarà allineato su un confine di 4 byte.

Questo viene fatto per velocizzare l'accesso alla memoria ed evitare problemi di allineamento hardware.

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; }

Potresti chiederti perché la dimensione di struct Example sia di 16 byte, anche se ogni campo è allineato al confine del tipo più grande, che è 8 byte. A prima vista, allineare tutti e tre i campi a 8 byte potrebbe suggerire una dimensione totale di 24 byte. In realtà, il funzionamento è leggermente diverso.

Il primo campo a è un char e occupa 1 byte. Per garantire che il campo successivo b di tipo int inizi su un confine di 4 byte, il compilatore aggiunge 3 byte di padding dopo a. Il campo b stesso occupa 4 byte ed è ora correttamente allineato.

Il campo successivo c è un double e deve iniziare su un confine di 8 byte. Il compilatore aggiunge padding dopo b per posizionare c all'indirizzo corretto. Il campo c occupa 8 byte.

In totale: 1 byte per a + 3 byte di padding + 4 byte per b + 8 byte per c = 16 byte. Le regole di allineamento sono rispettate e la memoria viene utilizzata in modo efficiente.

question mark

Perché la dimensione di una struct spesso supera la somma delle dimensioni dei suoi singoli campi?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 2

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

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?

bookAllineamento e Padding nelle Struct

Scorri per mostrare il menu

Allineamento

Ogni campo di una struttura è allineato a un confine che è un multiplo della dimensione dell'elemento più grande della struttura.

Ad esempio, se l'elemento più grande ha una dimensione di 4 byte, allora ogni elemento sarà allineato su un confine di 4 byte.

Questo viene fatto per velocizzare l'accesso alla memoria ed evitare problemi di allineamento hardware.

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; }

Potresti chiederti perché la dimensione di struct Example sia di 16 byte, anche se ogni campo è allineato al confine del tipo più grande, che è 8 byte. A prima vista, allineare tutti e tre i campi a 8 byte potrebbe suggerire una dimensione totale di 24 byte. In realtà, il funzionamento è leggermente diverso.

Il primo campo a è un char e occupa 1 byte. Per garantire che il campo successivo b di tipo int inizi su un confine di 4 byte, il compilatore aggiunge 3 byte di padding dopo a. Il campo b stesso occupa 4 byte ed è ora correttamente allineato.

Il campo successivo c è un double e deve iniziare su un confine di 8 byte. Il compilatore aggiunge padding dopo b per posizionare c all'indirizzo corretto. Il campo c occupa 8 byte.

In totale: 1 byte per a + 3 byte di padding + 4 byte per b + 8 byte per c = 16 byte. Le regole di allineamento sono rispettate e la memoria viene utilizzata in modo efficiente.

question mark

Perché la dimensione di una struct spesso supera la somma delle dimensioni dei suoi singoli campi?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 2
some-alt