天天看點

番外1 什麼?sizeof(list<int>)竟然是24

之前寫了這樣一段代碼,

首先我們需要知道list是個什麼東東:

點進std::list,可以看到以下代碼,可以看出list這玩意貌似沒有成員?但他繼承了一個 __list_imp<_Tp, _Alloc>:

點進__list_imp可以看到這個代碼,有一個__end_,我們離真相又近了一點了,__end_是__node_base類型的,可以看到前邊有個typedef:

點進__list_node_base,看看這是個啥玩意。哦豁,發現了兩個指針!

注意,這是個父結構體,再看看他子結構體的實作,如下:

好啊,終于找到了list的資料成員了,兩根指針,一個資料,類似于以下形式:

但是回到正題,為什麼std::list是24呢?

我的機子是64位機,指針是8bytes,int是4個位元組,8*2+4 = 20,沒毛病,20。

但是輸出為什麼是24呢?

遇到這種問題,我們一般就需要從編譯器角度考慮了(首先可以肯定,這肯定不是我的問題!)

結構體對齊,嗯結構體對齊,這是編譯器考慮的範疇。

記憶體對齊的作用:

位元組對齊主要是為了提高記憶體的通路效率,比如intel 32位cpu,每個總線周期都是從偶位址開始讀取32位的記憶體資料,如果資料存放位址不是從偶數開始,則可能出現需要兩個總線周期才能讀取到想要的資料,是以需要在記憶體中存放資料時進行對齊。

結論1:一般情況下,結構體所占的記憶體大小并非元素本身大小之和。

結論2:結構體記憶體大小應按最大元素大小對齊,如果最大元素大小超過模數,應按模數大小對齊。

這裡的模數就需要編譯器來操作啦!

我們試試取消記憶體對齊試試:

可以發現,test已經是20了,說明list為24的原因就是因為記憶體對齊所緻。

記憶體對齊的相關知識可以參考:https://www.zhihu.com/question/27862634

詳細的記憶體對齊内容,将在以後探讨....

STL