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
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?
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!