Udostępnij przez


Ostrzeżenie kompilatora (poziom 4) C4121

'symbol' : wyrównanie elementu członkowskiego było wrażliwe na pakowanie

Uwagi

Kompilator dodał dopełnienie, aby wyrównać element członkowski struktury na granicy pakowania, ale wartość pakowania jest mniejsza niż rozmiar tego elementu.

Example

Na przykład poniższy fragment kodu powoduje C4121:

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

Aby rozwiązać ten problem, wprowadź jedną z następujących zmian:

  • Zmień rozmiar pakowania na rozmiar elementu członkowskiego, który spowodował ostrzeżenie, lub większy rozmiar. Na przykład w tym fragmencie kodu zmień wartość pack(2) na pack(4) lub pack(8).

  • Zmień kolejność deklaracji elementów członkowskich według rozmiarów, od największych do najmniejszych. We fragmencie kodu należy odwrócić kolejność składowych struktury, tak aby long long element członkowski poprzedzał intelement , i int poprzedza element char.

To ostrzeżenie występuje tylko, gdy kompilator dodaje dopełnienie przed elementami członkowskimi. Nie następuje, gdy pakowanie umieściło dane w lokalizacji w pamięci, która nie jest dostosowana dla tego typu danych, ale nie umieszczono dopełnienia przed elementem członkowskim. Gdy dane nie są wyrównane na granicach, które stanowią wielokrotność rozmiaru danych, sprawność działania może się zmniejszyć. Odczytywanie i zapisywanie niewyrównanych danych powoduje usterki procesora w niektórych architekturach, a znalezienie i usunięcie problemów może zająć czas dwa, a nawet trzy rzędy wielkości dłuższy niż normalnie. Dostępów do niewyrównanych danych nie można przenieść na niektóre architektury RISC.

Można użyć #pragma pack lub /Zp , aby określić wyrównanie struktury. (Kompilator nie generuje tego ostrzeżenia, gdy /Zp1 jest określony).