福哥答案2020-09-30:#福大大架構師每日一題#c++
2020-09-30:談談內存對齊,如何回答呢?
2020-09-30:談談內存對齊。golang
1、爲何須要內存對齊?
1.平臺。
2.性能。c#
2、各類語言的內存對齊規則以下:
1.C++:
空類的內存大小爲1字節。繼承n個空類,內存大小是n-1個字節。架構
規則以下:
1)第一個成員在與結構體偏移量爲0的地址處。
2)其餘成員變量要對齊到對齊數的整數倍的地址處。
注意:對齊數 = 編譯器默認的一個對齊數與該成員大小的較小值。
VS中默認的對齊數爲8,gcc中的對齊數爲4
3)結構體總大小爲:最大對齊數(全部變量類型最大者與默認對齊參數取最小)的整數倍。
4)若是嵌套告終構體的狀況,嵌套的結構體對齊到本身的最大對齊數的整數倍處,結構體的總體大小就是全部最大對齊數(含嵌套結構體的對齊數)的整數倍。性能
2.Java:
空類的內存大小爲16字節。url
默認是 8 字節對齊(能夠經過-XX:ObjectAlignmentInBytes指定,默認是 8,也就是 8 字節對齊)。.net
3.golang:
空結構體內存大小爲0字節。final zero field:結構體裏的最後一個屬性若是是空結構體,會當成1個字節處理。若是結構體嵌套的全是空結構體,仍是0個字節。對象
規則跟c++同樣,64位下默認對齊數是8。blog
4.rust:
空結構體的內存大小爲0字節。繼承
結構體規則跟c++同樣。64位下默認對齊數是8。
5.c#:
空結構體的內存大小爲1字節。
結構體規則跟c++同樣。64位下默認對齊數是8。結構體上設置特性可修改默認對齊數。
類的new對象的內存對齊不熟,暫無。