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