1. 程式人生 > >【2017-07-01】Linux應用開發工程師面試問題記錄之二:關於結構體的大小及內存對齊問題

【2017-07-01】Linux應用開發工程師面試問題記錄之二:關於結構體的大小及內存對齊問題

偶數 而且 strong span net 但是 開發 f11 flag

Tencent後臺服務器開發有一道題是計算一個結構體的sizeof的大小:

struct strData

{

int m_Int;

char m_Char;

short m_Short;

char m_Flag;

}

系統為32位的Unix機器,請問sizeof(strData)的值是多少?

在32位系統中,int類型為4個字節,char類型為1個字節,short為2個字節,所以理論上上述結構體占用的空間總共為8個字節;

但是,內存存放數據時如果各種類型合理對齊時,cpu訪問數據的效率就比較高;比如某些平臺上每次讀取數據都是從偶地址開始,如果數據字節對齊的話,可能只需要一個cpu周期就可以取得數據。

因此,假設存儲地址從0x0000開始,則上述結構體中,m_Int是0-3,m_Char是4,m_short是6-7,m_Flag是8,共9個字節,鑒於4字節對齊,所以還需要額外的3字節,因此sizeof此結構體的大小為12個字節。

如果改成

struct strData

{

short m_Short;

char m_Char;

char m_Flag;

int m_Int;

}

這樣的話就是8個字節了。

註意一定是偶數地址對齊,而且整個結構體的大小也必須是結構體最大對齊值的整數倍。

當然了,如果是單字節對齊就是理想的內存占用。

這也算是最基本的問題了,如果這也答錯了,那被鄙視也是應該的了。

希望能知恥而後勇。

參考鏈接:

為什麽需要字節對齊?

http://blog.csdn.net/zkf11387/article/details/7662450

詳解結構體、類等內存字節對齊

http://zhangyu.blog.51cto.com/197148/673792/

32位與64位下各類型長度對比

http://blog.csdn.net/sky_qing/article/details/11650497/

【2017-07-01】Linux應用開發工程師面試問題記錄之二:關於結構體的大小及內存對齊問題