簡體   English   中英

C ++中的#pragma pack

[英]#pragma pack in C++

為什么我們需要在C ++中使用#pragma pack for typedef結構? 特別是當您在網絡通信中使用這些結構時。

#pragma pack控制結構成員的對齊方式。 常見的默認設置為8,確保長達8個字節的成員在一個大小為其倍數的地址上對齊。 例如,雙指針或64位指針。 讀取或寫入錯誤對齊的double可能非常昂貴,如果跨越CPU緩存行邊界,通常會慢三倍。 此對齊可能會在成員之間產生未使用的空間,稱為填充。

這種對齊通常不適合網絡幀,它們往往緊密包裝而沒有任何填充,#pragma pack(push,1)

#pragma pack指令僅修改聲明遵循該指令的結構的成員的當前對齊規則。 它不會直接影響結構的對齊,但是通過影響結構構件的對齊,可能會影響整體結構的對齊,符合對齊規則

如果您只需要讓具有相同設置的2個系統相互通信(測試,...),您可以發送結構,前提是它們只是POD(普通舊數據)(指針,虛擬表,std :: strings .. 。不能使用)。 所以不需要打包。

如果系統沒有相同的設置(或未知),則需要發送協議序列化的數據,因此打包結構不會。 最簡單的方法是檢查有效的protcols是否可用。

編譯器將“填充”結構的字段和子字段,即在內存中使用空白的內存塊組織它們,這些內存中間沒有任何內容。 正如Hans Passant的回答所解釋的那樣,這樣做是為了提高效率。

不同的編譯器/目標/優化設置可以填充不同,在不相等的內存表示中轉換相同的“邏輯”結構,因此如果兩個通信機器在它們之間傳遞結構,則它們可能彼此不理解。

#pragma pack是限制編譯器填充自由的方法。

#pragma pack(push,1)命令編譯器根本不填充。 如果對不同代碼中定義的兩個相同結構執行此操作,則它們將在內存中以相同的形式表示。 然后,您可以使用指針和sizeof()通過某個協議在一個應用程序中安全地發送結構的內容,在另一側獲取它並將其寫在相同的結構上,同樣使用指針和sizeof()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM