C 位元組對齊容易被忽略的兩個問題

2021-06-16 21:28:22 字數 989 閱讀 4186

關於結構體位元組對齊的金科玉律在網上隨便就能查得到,我就不贅述了。

在這裡就分享兩條開發中曾經忽略的問題:

先看**:

#pragma pack(4)

struct com

; char chtest1;

char chtest2;

};#pragma pack()

sizeof(struct com) = ?

gcc 4.1 和 vc 2005環境下,答案是20。

除錯一下結構體的記憶體布局,發現,union自身增加了2個位元組的填充,用來保持union本身的4位元組對齊。

即union在記憶體中變成:

union

;

這樣union就變成了16位元組,加上2個char型別的位元組後,為了保持struct的自身位元組對齊,在struct末尾再填充兩位元組.

最終結構體的記憶體布局是這樣的:

#pragma pack(4)

struct com

;char chtest1;

char chtest2;

byte padding2[2];

};#pragma pack()

做平台移植的同仁要注意了,遇到不確定的位元組對齊問題,最好先親自試一下,不能太想當然了:

(1)win32下,vc編譯器預設8位元組對齊,而且支援1、2、4、8、16五種對齊方式。

(2)linux 32下,gcc 4.1預設4位元組對齊,支援1、2、4三種對齊方式。因此結構體

中即使遇到double、long long這樣的8位元組變數,仍然按4位元組對齊。即使設定了#pragma pack(8)

(3)安卓4.0, arm cpu的ndk編譯環境,預設情況下,遇到double、long long型別的變數時,不同於pc linux 32,會按照8位元組對齊方式對齊。

以上問題也是我實際開發工作中遇到的,如果有不同意見歡迎交流!

關於 的乙個容易被忽略的問題

a 0,1,2,3,0,1,2 5 a 4 3 在一般來說,所有的使用者都知道元組一旦被建立就不可更改,除非用乙個新的元組來覆蓋它,但是上面的示例有了不同的反饋。執行之後得到了異常 typeerror tuple object does not support item assignment 在這個...

C 類中兩個易被忽略的預設函式

c 的自定義類中有六個預設的函式,即如果使用者沒有顯式定義這些函式時,c 編譯器會類中生成這些函式的預設形式。除了大家所熟知的建構函式 拷貝建構函式 賦值函式和析構函式外,c 為自定義類 還提供了兩個容易被人忽視的預設函式 取位址函式和對常物件的取位址函式。由上面的例子可知,c 允許通過取位址運算子...

兩個容易忽視的小問題

兩個容易忽視的小問題 1,在linux系統下,連root使用者無法用su切換到別的使用者,總是報錯密碼不對。後來發現本地配置了winbind服務來跟windows ad域整合,winbind啟動失敗,導致該錯誤發生。很難聯絡到這個原因。2,在oracle的函式裡,to char,to number是...