爲什麼我們需要在C++中有#pragma pack
爲typedef
結構?特別是當你在網絡通信中使用這些結構時。#C++中的#pragma pack
回答
#pragma pack指令只修改聲明遵循指令的結構成員的當前對齊規則。它不直接影響結構的對齊,但是通過影響結構成員的對齊,它可能會根據對齊規則影響整體結構的對齊。
#pragma pack
#pragma pack
控制結構成員的對齊。常見的默認設置是8,確保長達8個字節的成員在一個大小爲倍數的地址上對齊。例如,一個雙精度或64位指針。讀取或寫入錯誤對齊的double可能非常昂貴,如果跨越CPU高速緩存行邊界,讀寫速度通常要慢三倍。這種對齊會在成員之間產生未使用的空間,稱爲填充。
這種定位往往是不恰當的網絡框架,他們往往是緊密包裝沒有任何填充,包裝的#pragma(推,1)
如果你只是需要讓2個系統具有相同的設置聊(測試,...),你可以發送結構,只要它們是POD(普通的舊數據)(指針,虛擬表,std :: strings ...不能使用)。所以不需要包裝。
如果系統沒有相同的設置(或未知),則需要發送數據在協議中串行化,因此打包的結構將不會執行。檢查是否有效的協議是最簡單的。
編譯器將「填充」結構的字段和子字段,即在內存中用空白的內存塊來組織它們,這些內存塊在中間不包含任何東西。正如Hans Passant的答案所解釋的那樣,這樣做可以提高效率。
不同的編譯器/目標/優化設置可能填充不同,在不等內存表示中轉換相等的「邏輯」結構,所以如果兩個通信機器之間傳遞結構,它們可能不會相互理解。
#pragma pack是您限制編譯器自由填充的方法。
#pragma pack(push,1)命令編譯器根本不填充。如果你這樣做了用不同代碼定義的兩個相同的結構,它們將在內存中被相同地表示。然後,您可以安全地通過使用指針和sizeof()的某種協議在一個應用程序中發送結構的內容,並在另一端獲取它,並使用指針和sizeof()將其寫在相同的結構中。
- 1. C++ #pragma pack
- 2. #pragma pack(16)和#pragma pack(8)的效果總是一樣嗎?
- 3. Valgrind和「#pragma pack(2)」
- 4. 使用類#pragma pack
- 5. iphone上的pragma pack(push)
- 6. 什麼禁用#pragma pack(push)?
- 7. 如何追溯#pragma pack?
- 8. VB6是否有等效的#pragma pack?
- 9. #使用GCC的#pragma pack(顯示)
- 10. 在c中使用#pragma pack但無法理解
- 11. Pragma Pack使用導致jvm崩潰的C庫
- 12. Pragma在C++結構類中
- 13. #pragma pack()調用有什麼作用?
- 14. 爲什麼VC++中的#pragma pack使用堆棧?
- 15. 的#pragma pack()的與推入和彈出VS解壓
- 16. 什麼是網絡預設電臺'的#pragma pack`呢?
- 17. python ctypes pragma pack用於字節對齊的讀取
- 18. Pragma評論C++
- 19. Html Agility Pack c#
- 20. C++ pack/unpack
- 21. C pragma omp並行
- 22. 在C++/CLI中#pragma managed(push,on)和#pragma managed(push,off)?
- 23. python中的Pragma
- 24. C中#pragma和_Pragma()之間的差異
- 25. 在VS 2008/2010中控制尾隨結構填充? (#pragma pack不夠好)
- 26. 預處理的#pragma用C相關和C++
- 27. 在Solaris和Linux上使用#pragma pack(1)時的結構大小差異
- 28. 用C使用#pragma節
- 29. GCC的#pragma中斷
- 30. #pragma在C中無法正常工作?
以下是您需要的所有信息。這是搜索查詢`pragma pack`在谷歌搜索結果中的第一個詞條:http://msdn.microsoft.com/en-us/library/aa273913%28v=vs.60%29.aspx – bezmax 2010-12-22 09:24:05
這是怎麼回事?面向對象編程? – 2010-12-22 09:24:11