共用方式為


編譯器警告 (層級 4) C4121

'symbol' : 成員的記憶體對齊受 pack 影響

編譯器加入了填補來調整封裝邊界上的結構成員,但是封裝值小於成員的大小。 例如,下列程式碼片段會產生 C4121:

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

若要修正這個問題,請進行下列任一項變更:

  • 將封裝大小變更為造成警告的成員大小,或更大的大小。 例如,在這個程式碼片段中,將 pack(2) 變更為 pack(4)pack(8)

  • 依從最大到最小的順序,重新排列成員宣告。 在這個程式碼片段中,反轉結構成員的順序,使得 long long 成員在 int 前面,以及 intchar 前面。

只有在編譯器於資料成員前面加入填補時,才會出現這個警告。 當封裝將資料放入未對齊資料類型的記憶體位置,而資料成員前面沒有填補時,並不會出現這個警告。 當資料未在大小為資料的數倍之邊界上對齊時,效能就可能會降低。 讀取和寫入未對齊的資料會造成某些架構上發生處理器錯誤,而錯誤可能需要花兩、三倍以上的時間才能解決。 未對齊的資料存取無法移植到某些 RISC 架構中。

您可以使用 #pragma 套件/Zp 來指定結構對齊方式。 (指定 /Zp1,編譯程式不會產生此警告。