linux內存模型
引用
https://www.cnblogs.com/virusolf/p/4951122.html?from=singlemessage
image.png
arm_v8的內存模型
結構體的內存分配
首先,結構在C語言中也是一種數據類型,叫做聚組類型(還包括數組)。他和其他的數據類型是一樣的,在定義一個結構體的時候,系統并不會為他真正的分配內存空間(定義的結構體變量要在編譯的階段才分配空間,而結構體指針要顯示的使用malloca來分配空間),也就是說,在定義結構體這種數據類型的時候是不會分配內存空間的,只有在定義變量的時候,才會分配。
下面是摘自百度百科 對結構題存儲的三點:
- 結構體變量的首地址能夠被其最寬基本類型成員的大小所整除;
- 結構體每個成員相對于結構體首地址的偏移量都是成員大小的整數倍,如有需要編譯器會 在成員之間加上填充字節;
- 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之后加上填充字節
下面是來自《c和指針》的介紹
struct s1{
char a;
int b;
char c;
};
首先,結構體在存儲的時候,結構體的首地址必須能夠被其中最寬數據類型整除。(在s1中,最寬數據類型為int,在32位系統中為4Byte),
其次,參照第二條,第一個數據時char(已經保證了,結構的起始地址是4的整數倍),存儲一個char,占一個Byte,要保證下一個int的存儲起始地址是4的整數倍,所以要在char后面填充三個Byte,然后在存儲第三個數據。
第三,最后一個也是char類型,他就占一個Byte,肯定是他存儲位置的整數倍,最后參照第三條,結構體的總大小為最寬數據類型的整數倍,所以會在第二個char之后再填充三個Byte。
這樣的話,總共占據的空間是1+3+4+1+3 = 12(紅色為填充字符)
【但是】,調換一下結構中數據成員的順序
struct s1{
int b;
char a;
char c;
};
同樣地分析4+1+1+2 = 8
相比之下,存儲空間的效率提高33%。