最近由於專案的位元組對齊導致了2次比較詭異的記憶體問題。這裡進行一次總結,首先描述一下第一次的現象。
我們專案的網路是使用iocp做的,是乙個包含iocp封裝和本地資料結構與網路位元組流的序列化和反序列化的乙個庫。作為乙個lib客戶端和伺服器共用的。一次客戶端的開發發現協議內容解析一直不正確,跟蹤除錯發現同乙個結構體大小一下子20,一下子24。然後仔細一看,在lib裡面是24,在客戶端**裡面就是20。最後我們就得出結論是lib和客戶端工程對齊方式不一致的問題導致的。lib工程的struct member alignment使用的是default(/zp8),而客戶端工程使用的是/zp4。
第乙個案例還比較好發現,第二個案例就完全是猜測了。
我們伺服器使用luabind+c++實現了自動發包工具,原來只要在lua指令碼裡面生成乙個協議包就直接發出去了,現在卻發現一發包就崩在luabind的member賦值過程中了。根本無法完全確定原因。不過第乙個案例就在最近,我才猜了一下,可能luabind工程對齊方式跟我們的網路lib對齊方式不同導致的。結果對了。不然這個問題的解決肯定是遙遙無期了。
總結:依賴工程之間對齊方式不同,共用了結構體,那肯定導致問題的。問題包括資料不對,結構體多種size,程式崩潰。
位元組對齊的問題
為了能使cpu對變數進行高效快速的訪問,變數的起始位址應該具有某些特性,即所謂的 對齊 例如對於4位元組的int型別變數,其起始位址應位於4位元組邊界上,即起始位址能夠被4整除。變數的對齊規則如下 32位系統 type alignment char 在位元組邊界上對齊 short 16 bit 在雙...
位元組對齊的問題
位元組對齊的細節和具體編譯器實現相關,表現為具體的彙編翻譯可能會因為編譯器的不同而不同,但一般而言,滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數 倍,如有需要編譯器會在成員之間加上填充位元組 例如上面第二個結...
位元組對齊的問題
基本概念 位元組對齊 計算機儲存系統中以byte為單位儲存資料,不同資料型別所佔的空間不同,如 整型 int 資料佔4個位元組,字 符型 char 資料佔乙個位元組,短整型 short 資料佔兩個位元組,等等。計算機為了快速的讀寫資料,預設情況下將資料存放在某個位址的起始位置,如 整型資料 int ...