Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os níveis de empaquetamento afetam a disposição da memória dos tipos tanto para o MIDL como para o compilador Microsoft C/C++ da mesma forma. Em ambientes de compilação da Microsoft, como o ambiente de compilação definido pelo VC++ ou pelo Platform Software Development Kit (SDK), o nível de empacotamento padrão para compiladores MIDL e C/C++ é o mesmo; o nível de empacotamento padrão para os ambientes de compilação do Windows de 32 bits e 64 bits é 8.
Alinhamento Natural
Para tipos de memória, o alinhamento padrão é o mesmo que seu alinhamento natural.
- Um tipo base, como short, float e __int64, e um ponteiro são alinhados naturalmente se sua representação começar em um endereço que seja múltiplo do seu tamanho. Todos os tipos de base atualmente suportados têm tamanhos de 1, 2, 4 ou 8. Os ponteiros têm um tamanho de 4 em ambientes de 32 bits e 8 em ambientes de 64 bits.
- Um tipo composto está alinhado naturalmente se cada um dos seus componentes estiver alinhado naturalmente em relação ao início do tipo e se não houver lacunas desnecessárias entre os componentes. Componentes compostos, como campos ou elementos, são transformados em componentes do tipo ponteiro ou base.
Uma regra simples para ajudar a lembrar esse comportamento é que o alinhamento natural de um tipo é igual aos maiores alinhamentos de seus componentes.
Há uma conexão entre o alinhamento e o tamanho da memória de um tipo em linguagens como C ou C++ e IDL, conforme expresso pelo operador sizeof(). O tamanho é um múltiplo do alinhamento (o múltiplo mínimo que abrange o tipo). Isso decorre de uma representação de matriz na memória.
O alinhamento natural é importante porque o acesso a dados desalinhados pode causar uma exceção em alguns sistemas. Os dados podem ser marcados para uma manipulação segura quando desalinhados, mas normalmente isso envolve uma penalidade de velocidade que pode ser substancial em algumas plataformas.
Observação
Na memória, objetos de tipos com um alinhamento natural de n terão o alinhamento correto quando colocados em endereços que são um múltiplo de n.
Embalagem versus alinhamento
Especificar um nível de embalagem maior do que o alinhamento natural de um tipo não altera o alinhamento do tipo. Especificar um nível de embalagem menor do que o alinhamento natural reduz o alinhamento do tipo para o nível de embalagem. Como resultado, os tipos embalados podem ser colocados na memória em endereços que são um múltiplo do nível de embalagem (o alinhamento reduzido) sem causar um desalinhamento. Isso afeta tipos simples e tipos de componentes. Para tipos compostos, a disposição interna do tipo pode ser afetada, porque o alinhamento reduzido dos componentes pode alterar o tamanho do preenchimento necessário para o alinhamento adequado dos componentes, reduzindo assim o tamanho do tipo.
Uma regra simples para ajudar a lembrar este comportamento é que o novo alinhamento de um tipo compactado é o menor entre o nível de compactação e o seu alinhamento natural. O tamanho do tipo é um múltiplo do novo alinhamento. O operador sizeof() retorna o tamanho reduzido para tipos embalados.
Por exemplo, com o nível de embalagem 2 um longo torna-se alinhado em 2 e, portanto, pode ser colocado em qualquer endereço par, não apenas nos endereços que são um múltiplo de 4 como seria o caso com o alinhamento natural. Uma estrutura com um valor curto e outro longo, organizada em 2 bytes, não necessita do espaço interno entre o valor curto e o seguinte valor longo que era necessário para o alinhamento natural; assim, não só a estrutura agora está alinhada em 2 bytes, como também tem o seu tamanho reduzido de 8 para 6.
Como exemplo, considere um tipo composto que consiste em um caractere de 1 byte, um inteiro de 4 bytes de comprimento e um caractere de 1 byte:
struct mystructtype
{
char c1; /* requires 1 byte */
/* 3 bytes of padding with natural alignment only */
long l2; /* requires 4 bytes */
char c3; /* requires 1 byte */
/* 3 bytes of padding with natural alignment only */
} mystruct;
Esta estrutura está naturalmente alinhada a 4 e tem o tamanho natural de 12.
Para embalagem de nível 4 ou superior, a estrutura mystruct é alinhada em 4 e sizeof(struct mystructtype) é igual a 12. A estrutura será desalinhada se localizada na memória num endereço que não seja um múltiplo de 4.
Para o nível de embalagem 2, a estrutura é alinhada em 2 e seu tamanho é 8. A estrutura alinhada ao nível 2 ficará desalinhada se estiver localizada na memória num endereço que não seja múltiplo de 2.
Para o nível de embalagem 1, a estrutura é alinhada em 1 e seu tamanho é 6. A estrutura com nível 1 pode ser colocada em qualquer lugar sem causar uma falha de desalinhamento.
Tópicos relacionados