回答
某些數據類型必須與某個邊界對齊。因此,例如:
struct V
{
char a;
double b;
char c;
double d;
};
的sizeof(char)的是1和sizeof(雙)是8,但該結構的大小可以比預期的18更多,如果需要的雙打對齊到8字節邊界。在這種情況下,並且因爲成員應該按照它們在結構中聲明的順序出現在內存中,所以可能會有7個字節的「padding」靠近成員c,並且可能有一些成員也是。
當包裝非標準化時,這個危險就來了,因此這個結構體的大小可能會有所不同,並且您可以通過電線以「二進制」格式發送它,或將其存儲在文件中,以便在其他位置讀取它如果這個double的endian-ness是一樣的)。
作爲通過編譯指示刪除警告的建議的替代方法,您可以決定通過更改成員的順序來處理代碼。把那些需要最大的路線放在第一位,然後放低一些。所以先把指針和雙打,然後整數,然後短褲和任何字符成員最後。
從MSDN摘自 -
「符號」:一個構件的對準是包裝
的結構構件上的存儲器偏移量,其值是不構件的大小的倍數對齊敏感。例如,下面的代碼片段會產生這樣的警告:
// C4121.cpp
// compile with: /W4 /c
#pragma pack(2) // C4121
struct s
{
char a;
int b;
};
你可以做以下更改之一,以防止此警告:
- 變化
pack(2)
到pack(4)
。 - 顛倒結構成員的順序,使
int
在char
之前。
當數據不屬於數據的大小性能會下降的倍數邊界,如果你的代碼移植對準RISC機器也不會編譯。
您可以使用#pragma pack或/ Zp指定結構對齊方式。請注意,當指定/ Zp1時,編譯器不會生成此警告。
爲什麼只發佈一個網址? MSDN鏈接一直在打破。 – Anders 2010-10-08 09:09:12
- 1. 下面的警告是什麼意思?
- 2. C++類包裝/成員對齊
- 3. 對齊堆棧是什麼意思?
- 4. 什麼意思是「緩存線對齊」?
- 5. 對齊敏感div中心
- 6. NSObject.BroadSystemFontWeights警告消息是什麼意思?
- 7. 這個Xcode警告是什麼意思? 「
- 8. 什麼意思是iOS Xcode plist警告?
- 9. 「隱藏」警告。這是什麼意思?
- 10. 「BS警告」是什麼意思?
- 11. 這些ANTLR警告是什麼意思
- 12. Android:這個警告是什麼意思?
- 13. 警告:mysql_real_escape_string()是什麼意思?
- 14. Installshield警告-7205:這是什麼意思
- 15. boost.random車警告 - 這是什麼意思?
- 16. HHH000387休眠警告是什麼意思?
- 17. 在成員函數中返回類對象是什麼意思?
- 18. 「檢測到的軟件包降級」警告是什麼意思?
- 19. `-pedantic`生成的編譯器警告是什麼意思?
- 20. C#中成員訪問中的問號是什麼意思?
- 21. Objective-C警告 - 無法獲取對象ID - 這是什麼意思?
- 22. 對齊方式:警告C4316在所有課程中有對齊的成員
- 23. Scala中的「不是簡單類型」警告是什麼意思?
- 24. 局部敏感哈希值是什麼意思?
- 25. 這個C警告是什麼意思? 「INT格式,指針ARG」
- 26. Heroku日誌中這條警告的意思是什麼
- 27. Chrome Profiler中的「未優化」警告是什麼意思?
- 28. 對齊節的開始是什麼意思?
- 29. 警告C4247和C4248是什麼意思,爲什麼從Visual C++ 2005中刪除?
- 30. C中##是什麼意思?
如果您需要更具體的幫助,您應該發佈結構的定義。 – 2010-10-08 09:05:42