- 廢話不多說,先來最簡單第一問:
結構體people佔用多少內存?
struct people{
char sex,
short age,
int money,
chat flag,
};
錯誤答案:sex 1byte+age 2betes+ money 4bytes+ flag 1byte=8bytes
正確答案:12bytes
面試官繼續第二問:為什麼是12字節?
回答:編譯器問了提高編譯出的可執行文件的效率,需要考慮內存對齊。
面試官第三問:什麼是內存對齊,為什麼這樣能提高效率?
答案:
假設不內存對齊,編譯器編出的程序會這樣處理people結構體,如下圖
可以看到,money成員被分別存放在倆個內存地址空間上了。這樣的話,編譯出來的程序要訪問money成員變量,必須要把addr1和addr2內存中的數據都取出來,然後再提取出money變量數據部分。這樣效率是很低的。
因此,為了程序提高效率,編譯器會優化people結構體的存儲方式。優化後,如下圖
優化後,現在程序要訪問money成員變量,只要直接操作addr2中的數據了
面試官輕鬆最後一問:如何強制告訴編譯器,讓編譯器不內存對齊的方式去優化結構體?
答案:為結構體定義添加packed屬性,如下
struct people{
char sex,
short age,
int money,
chat flag,
}__attribute__((packed));
OK,面試結束,offer到手!
閱讀更多 無邪啊 的文章