Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Alinhamento e Preenchimento em Structs | Compreendendo Structs e Memória
Dominando Structs em C

bookAlinhamento e Preenchimento em Structs

Alinhamento

Cada campo de uma estrutura é alinhado a um limite que é múltiplo do tamanho do maior elemento da estrutura.

Por exemplo, se o maior elemento tiver 4 bytes de tamanho, então cada elemento será alinhado em um limite de 4 bytes.

Isso é feito para acelerar o acesso à memória e evitar problemas de alinhamento de 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; }

Você pode estar se perguntando por que o tamanho de struct Example é 16 bytes, mesmo que cada campo seja alinhado ao limite do maior tipo, que é 8 bytes. À primeira vista, alinhar todos os três campos a 8 bytes pode sugerir um tamanho total de 24 bytes. Na realidade, funciona de forma um pouco diferente.

O primeiro campo a é um char e ocupa 1 byte. Para garantir que o próximo campo b, do tipo int, comece em um limite de 4 bytes, o compilador adiciona 3 bytes de preenchimento após a. O campo b em si ocupa 4 bytes e agora está devidamente alinhado.

O próximo campo c é um double e precisa começar em um limite de 8 bytes. O compilador adiciona preenchimento após b para posicionar c no endereço correto. O campo c ocupa 8 bytes.

No total: 1 byte para a + 3 bytes de preenchimento + 4 bytes para b + 8 bytes para c = 16 bytes. As regras de alinhamento são seguidas e a memória é utilizada de forma eficiente.

question mark

Por que o tamanho de uma struct frequentemente excede a soma dos tamanhos de seus campos individuais?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 2

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

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?

bookAlinhamento e Preenchimento em Structs

Deslize para mostrar o menu

Alinhamento

Cada campo de uma estrutura é alinhado a um limite que é múltiplo do tamanho do maior elemento da estrutura.

Por exemplo, se o maior elemento tiver 4 bytes de tamanho, então cada elemento será alinhado em um limite de 4 bytes.

Isso é feito para acelerar o acesso à memória e evitar problemas de alinhamento de 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; }

Você pode estar se perguntando por que o tamanho de struct Example é 16 bytes, mesmo que cada campo seja alinhado ao limite do maior tipo, que é 8 bytes. À primeira vista, alinhar todos os três campos a 8 bytes pode sugerir um tamanho total de 24 bytes. Na realidade, funciona de forma um pouco diferente.

O primeiro campo a é um char e ocupa 1 byte. Para garantir que o próximo campo b, do tipo int, comece em um limite de 4 bytes, o compilador adiciona 3 bytes de preenchimento após a. O campo b em si ocupa 4 bytes e agora está devidamente alinhado.

O próximo campo c é um double e precisa começar em um limite de 8 bytes. O compilador adiciona preenchimento após b para posicionar c no endereço correto. O campo c ocupa 8 bytes.

No total: 1 byte para a + 3 bytes de preenchimento + 4 bytes para b + 8 bytes para c = 16 bytes. As regras de alinhamento são seguidas e a memória é utilizada de forma eficiente.

question mark

Por que o tamanho de uma struct frequentemente excede a soma dos tamanhos de seus campos individuais?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 3. Capítulo 2
some-alt