Alinhamento 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
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.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Incrível!
Completion taxa melhorada para 4.35
Alinhamento 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
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.
Obrigado pelo seu feedback!