設置編譯器的內存對齊方式(C++)

項目開發過程當中常常會遇到,同一個結構體在兩個工程中使用,好比api和後臺服務。爲了通訊一致,兩處固然要有徹底一致的結構體定義。
可是有時候,明明看到兩處結構體定義同樣,可是api傳過來的結構體,後臺服務解析(通常是強轉)出亂碼。後面通過仔細排查,纔看到後臺服務定義該結構體的頭文件中有以下代碼:api

#pragma  pack (push,1)		//設置1字節對齊

//結構體定義在此處。。。。

#pragma pack(pop)			//取消1字節對齊

而在api的工程中,沒有像上面這樣來定義該結構體。兩處定義出現了不一致,致使解析出錯。
而上面代碼是什麼意思呢?
在缺省狀況下,C編譯器爲每個變量或是數據單元按其天然對界條件分配空間。通常地,能夠經過下面的方法來改變缺省的對界條件:spa

  • 使用僞指令#pragma pack(push, n),C編譯器將按照n個字節對齊。
  • 使用僞指令#pragma pack(pop),取消自定義字節對齊方式。

好比兩種結構體定義方式:code

struct sample1
{
	char a;
	int b;
};

#pragma pack(push,1)
struct sample2
{
	char a;
	int b;
};
#pragma pack(pop)

單從字面上看,sizeof(sample1)==sizeof(sample2)。
實際上,結構體sample1按照天然對界對齊(按照int的長度,4字節對齊),sizeof(sample1)=4+4=8
結構體sample2按照設定的對齊方式對齊(1字節對齊),sizeof(sample2)=1+4=5
固然你把sample1強轉成sample2,會產生字節錯位,形成亂碼。這是一個經驗教訓,切記!!開發

相關文章
相關標籤/搜索