Partilhar via


Aviso do compilador (nível 4) C4121

'símbolo': o alinhamento de um membro era sensível à embalagem

Observações

O compilador adicionou preenchimento para alinhar um membro da estrutura no limite de embalagem, mas o valor de empacotamento é menor do que o tamanho do membro.

Example

Por exemplo, o seguinte trecho de código produz C4121:

// C4121.cpp
// compile with: /W4 /c
#pragma pack(2)
struct s
{
   char a;
   int b; // C4121
   long long c;
};

Para corrigir esse problema, faça uma das seguintes alterações:

  • Altere o tamanho da embalagem para o tamanho do membro que causou o aviso ou maior. Por exemplo, neste trecho, altere pack(2) para pack(4) ou pack(8).

  • Reordene as declarações dos membros por tamanho, do maior para o menor. No trecho, inverta a ordem dos membros da estrutura de modo que o long long membro precede o int, e o int precede o char.

Esse aviso só acontece quando o compilador adiciona preenchimento antes dos membros de dados. Isso não acontece quando o empacotamento colocou dados em um local de memória que não está alinhado para o tipo de dados, mas nenhum preenchimento foi colocado antes do membro de dados. Quando os dados não estão alinhados em limites que são múltiplos do tamanho dos dados, o desempenho pode se degradar. Leituras e gravações de dados não alinhados causam falhas no processador em algumas arquiteturas e as falhas podem levar duas ou três ordens de magnitude a mais para serem resolvidas. Os acessos a dados não alinhados não podem ser portados para algumas arquiteturas RISC.

Você pode usar #pragma pacote ou /Zp para especificar o alinhamento da estrutura. (O compilador não gera esse aviso quando /Zp1 é especificado.)