結構體三連問!扛不過最後一問,offer與你say goodbye

  • 廢話不多說,先來最簡單第一問:

結構體people佔用多少內存?

struct people{

char sex,

short age,

int money,

chat flag,

};

錯誤答案:sex 1byte+age 2betes+ money 4bytes+ flag 1byte=8bytes

正確答案:12bytes

面試官繼續第二問:為什麼是12字節?

回答:編譯器問了提高編譯出的可執行文件的效率,需要考慮內存對齊。

面試官第三問:什麼是內存對齊,為什麼這樣能提高效率?

答案:

假設不內存對齊,編譯器編出的程序會這樣處理people結構體,如下圖

結構體三連問!扛不過最後一問,offer與你say goodbye

可以看到,money成員被分別存放在倆個內存地址空間上了。這樣的話,編譯出來的程序要訪問money成員變量,必須要把addr1和addr2內存中的數據都取出來,然後再提取出money變量數據部分。這樣效率是很低的。

因此,為了程序提高效率,編譯器會優化people結構體的存儲方式。優化後,如下圖

結構體三連問!扛不過最後一問,offer與你say goodbye

優化後,現在程序要訪問money成員變量,只要直接操作addr2中的數據了

面試官輕鬆最後一問:如何強制告訴編譯器,讓編譯器不內存對齊的方式去優化結構體?

答案:為結構體定義添加packed屬性,如下

struct people{

char sex,

short age,

int money,

chat flag,

}__attribute__((packed));

OK,面試結束,offer到手!


分享到:


相關文章: