Tenho experiência em C #. Sou muito um novato em uma linguagem de baixo nível como C.
Em C #, struct
a memória de é definida pelo compilador por padrão. O compilador pode reordenar os campos de dados ou preencher bits adicionais entre os campos implicitamente. Então, eu tive que especificar algum atributo especial para substituir esse comportamento para o layout exato.
AFAIK, C não reordena ou alinha o layout de memória de um struct
por padrão. No entanto, ouvi dizer que há uma pequena exceção que é muito difícil de encontrar.
Qual é o comportamento do layout de memória do C? O que deve ser reordenado / alinhado e não?
fonte
#pragma pack
mas com um controle mais refinado sobre a semântica._Alignas
.É específico da implementação, mas na prática a regra (na ausência
#pragma pack
ou semelhante) é:sizeof(T)
bytes.Portanto, dada a seguinte estrutura:
struct ST { char ch1; short s; char ch2; long long ll; int i; };
ch1
está no deslocamento 0s
no deslocamento 2ch2
está no deslocamento 4, imediatamente após sll
no deslocamento 8i
está no deslocamento 16, logo após 11Portanto,
sizeof(ST)
é de 24.Ele pode ser reduzido para 16 bytes reorganizando os membros para evitar o preenchimento:
struct ST { long long ll; // @ 0 int i; // @ 8 short s; // @ 12 char ch1; // @ 14 char ch2; // @ 15 } ST;
fonte
char
membro final ao seu exemplo.sizeof(T)
bytes. Por exemplo,double
em arquiteturas comuns de 32 bits é de 8 bytes, mas geralmente requer apenas alinhamento de 4 bytes . Além disso, o preenchimento no final da estrutura apenas preenche o alinhamento do membro da estrutura mais largo. Por exemplo, uma estrutura de 3 variáveis char pode não ter preenchimento.Você pode começar lendo o artigo da wikipedia sobre alinhamento de estrutura de dados para obter uma melhor compreensão do alinhamento de dados.
Do artigo da wikipedia :
De 6.54.8 Pragmas de Estrutura-Empacotamento da documentação GCC:
fonte