Agregados e uniões
Outros tipos, como arrays, structs e uniões têm mais rígidas exigências de alinhamento consistente agregada e união armazenamento recuperação de dados e de garantir. Aqui estão as definições de matriz, a estrutura e a união:
Matriz
Contém um grupo ordenado de objetos de dados adjacentes. Cada objeto é chamado de um elemento. Todos os elementos dentro de uma matriz tem o mesmo tamanho e tipo de dados.Structure
Contém um grupo ordenado de objetos de dados. Ao contrário dos elementos de uma matriz, os objetos dentro de uma estrutura de dados podem ter tamanhos e tipos de dados diferentes. Cada objeto em uma estrutura de dados é chamado de um membro.Union
Um objeto que contém qualquer um de um conjunto de membros nomeados. Os membros do conjunto nomeado podem ser de qualquer tipo. O armazenamento alocado para uma união é igual para o armazenamento necessário para maior membro dessa união, além de qualquer preenchimento necessários para o alinhamento.
A tabela a seguir mostra o alinhamento altamente sugerido para os membros de escalares de uniões e estruturas.
Tipo escalar |
Tipo de dados c |
Alinhamento necessário |
INT8 |
char |
Byte |
UINT8 |
unsigned char |
Byte |
INT16 |
short |
Word |
UINT16 |
unsigned short |
Word |
INT32 |
int, long |
Doubleword |
UINT32 |
int não assinado, unsigned long |
Doubleword |
INT64 |
__int64 |
Quadword |
UINT64 |
unsigned __int64 |
Quadword |
FP32 (único precision) |
float |
Doubleword |
FP64 (duplas precision) |
double |
Quadword |
PONTEIRO |
* |
Quadword |
__m64 |
__m64 de struct |
Quadword |
__m128 |
__m128 de struct |
Octaword |
As regras de alinhamento agregadas a seguir se aplicam:
O alinhamento de uma matriz é o mesmo que o alinhamento de um dos elementos da matriz.
O alinhamento do início de uma estrutura ou uma união é o alinhamento máximo de qualquer membro individual. Cada membro dentro da estrutura ou união deve ser colocado em seu alinhamento adequado, conforme definido na tabela anterior, que pode exigir o enchimento interno implícito, dependendo do membro anterior.
Tamanho da estrutura deve ser um múltiplo inteiro do seu alinhamento, o que pode exigir o enchimento após o último membro. Desde que as estruturas e uniões podem ser agrupados em arrays, cada elemento da matriz de uma estrutura ou união deve começar e terminar ao alinhamento adequado, previamente determinado.
É possível alinhar os dados de maneira a ser maior do que os requisitos de alinhamento, contanto que as regras anteriores são mantidas.
Um compilador individual pode ajustar a remessa de uma estrutura por motivos de tamanho. Por exemplo /ZP (alinhamento de membro Struct) permite ajustar a remessa de estruturas.