最近在開發客戶端網路連線過程遇到乙個非常奇怪的問題,這個問題卡了兩天多時間,百般嘗試,一籌莫展!一度讓我懷疑人生了
最後突然想到最近使用#pragma pack,設定記憶體對齊。當我取消這個**後,一切都正常了!
事件起因與網路資料協議的定義:
struct taginfo
;
word為兩個位元組,byte是乙個位元組,但是sizeof(taginfo)大小卻是4,想到記憶體對齊,就想當然設定了:
#pragma once
#pragma pack(1) //設定1位元組對齊
struct taginfo
;#pragma pack() //取消設定
在標頭檔案的開頭和結尾處分別設定,然後sizeof(taginfo)的大小就為3了。
本以為解決了乙個小問題,結果意想不到的問題出現了凡是引入此標頭檔案的類,在例項化時而有效,時而無效。還有各種各樣的賦值及記憶體錯誤!
結果取消對齊設定後,一切烏雲散盡,瞬間對人生充滿希望了
本人寫**10年有餘,然對此仍是小白,深為之汗顏。望後輩見之引以為戒,切記熟讀寶典於胸,方得大成啊,哈哈!
qq群:239759131 cocos 技術交流 歡迎您
C 記憶體對齊問題
c和c 不同 在c中struct class不占有記憶體,c 中,struct class通常占有1byte,原因是編譯器強 行在裡面放了乙個char,這樣可使這個class的不同例項化在記憶體中分配到獨一無二的位址 1 最基本的記憶體對齊情況 首先確定最大型別的大小 按照結構體中型別宣告順序來分配...
C中記憶體對齊問題
1 對於基本資料型別 許多計算機系統對基本資料型別可允許位址作了一定的限制,要求某種型別物件的位址必須是某個值n 通常是2 4 8 的倍數,從而來簡化處理器和儲存器之間的介面的硬體設計。如linux的對齊策略是2位元組資料型別,例如short的位址必須是2的倍數。而較大的資料型別如 int int ...
c語言記憶體對齊問題
計算機中的記憶體都是按照byte為單位進行分配,在理論上資料可以儲存在記憶體中的任意位置。計算機為了提高工作效率,一般要求記憶體中的資料存放在特定的位置,使計算機用最少的機器週期便可以訪問到這個資料,這就是c語言中的記憶體對齊問題。這裡以 int 型資料為例,如果記憶體中的資料按照4位元組對齊儲存,...