"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que `sizeof(myStruct)` retorna 6 bytes em vez de 8 bytes para uma estrutura com três membros `unsigned short`?

Por que `sizeof(myStruct)` retorna 6 bytes em vez de 8 bytes para uma estrutura com três membros `unsigned short`?

Publicado em 2024-11-18
Navegar:344

Why does `sizeof(myStruct)` return 6 bytes instead of 8 bytes for a struct with three `unsigned short` members?

Alinhamento de memória em estruturas C: entendendo a discrepância de tamanho

Ao trabalhar com estruturas C, o alinhamento de memória desempenha um papel crucial na determinação do real tamanho da estrutura na memória. O alinhamento da memória refere-se ao posicionamento de estruturas de dados em endereços de memória que são divisíveis por limites específicos. Isso garante acesso eficiente aos dados e otimização do desempenho.

Considere uma máquina de 32 bits em que o alinhamento da memória é normalmente definido para 4 bytes. Neste contexto, uma estrutura composta por vários membros curtos não assinados, como:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;

Espera-se que o tamanho da memória desta estrutura seja de 8 bytes (3 x 2 bytes). No entanto, o operador sizeof(myStruct) retorna apenas 6 bytes. Essa discrepância pode ser atribuída ao requisito de alinhamento.

No primeiro exemplo, cada membro curto ocupa 2 bytes. Como o limite de alinhamento tem 4 bytes, nenhum preenchimento é inserido entre os membros. Assim, o tamanho total permanece em 6 bytes.

Em contraste, a introdução de um membro int na estrutura, como visto abaixo, altera o comportamento do alinhamento:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;

Nesse caso, o membro int requer um limite de alinhamento de 4 bytes. Para garantir o atendimento a esse requisito, 2 bytes de preenchimento são inseridos entre o último membro curto não assinado (v3) e o membro int (i). Isso resulta em um tamanho total de 12 bytes (6 bytes de dados em shorts, 2 bytes de preenchimento e 4 bytes de dados em int).

Portanto, a diferença no tamanho da memória entre as duas estruturas surge de os requisitos de alinhamento de seus tipos de membros. Na primeira estrutura, o limite de alinhamento é atendido pelos próprios membros curtos, enquanto na segunda estrutura, é necessário preenchimento adicional para atender ao limite de alinhamento do membro int.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3