2010-12-22 57 views
3

爲什麼我們需要在C++中有#pragma packtypedef結構?特別是當你在網絡通信中使用這些結構時。#C++中的#pragma pack

+0

以下是您需要的所有信息。這是搜索查詢`pragma pack`在谷歌搜索結果中的第一個詞條:http://msdn.microsoft.com/en-us/library/aa273913%28v=vs.60%29.aspx – bezmax 2010-12-22 09:24:05

+0

這是怎麼回事?面向對象編程? – 2010-12-22 09:24:11

回答

0

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

13

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

這種定位往往是不恰當的網絡框架,他們往往是緊密包裝沒有任何填充,包裝的#pragma(推,1)

0

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

如果系統沒有相同的設置(或未知),則需要發送數據在協議中串行化,因此打包的結構將不會執行。檢查是否有效的協議是最簡單的。

0

編譯器將「填充」結構的字段和子字段,即在內存中用空白的內存塊來組織它們,這些內存塊在中間不包含任何東西。正如Hans Passant的答案所解釋的那樣,這樣做可以提高效率。

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

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

#pragma pack(push,1)命令編譯器根本不填充。如果你這樣做了用不同代碼定義的兩個相同的結構,它們將在內存中被相同地表示。然後,您可以安全地通過使用指針和sizeof()的某種協議在一個應用程序中發送結構的內容,並在另一端獲取它,並使用指針和sizeof()將其寫在相同的結構中。