結構體如何分配記憶體
基礎知識,其實是比較簡單的。(本文是以32位機為標準)
結構體如何分配記憶體也是根據cpu獲得資料的方式來決定的,因為資料最終是cpu來獲得,那麼cpu是怎麼獲得資料的?
cpu獲得資料方式是一次性獲得儘量多的完整的資料。,下面看為了得到 '儘量多' 和 '完整' 資料怎麼理解:
(1)cpu獲得某一結構體資料時每次獲得資料長度是一致的,不會是遇見char就讀1個位元組,遇見int就就讀4位元組,因為這樣調換過去調換過來將會嚴重的影響cpu的效率。那麼因該怎麼來從結構體讀出完整資料呢?
(2)為了取得結構體中完整的資料,cpu一次取得最小的資料長度為結構體資料之中最大型別長度(如int、char取一次資料就按int取)。這很容易理解,因為取少了資料就有可能不完整了。(32位機中有double取一次資料也是按照int長度取,畢竟32位機最多一次也只能取int的長度)
結構體在記憶體中分配位置的方式當然應該和cpu讀取方式相符合。
(3)首地址必須位於結構體中最大資料型別長度整數倍的地址處。這種方式可以更好的節約記憶體,並且提高cpu提取資料的效率。
(4)其中儘量多是指在取一次資料操作時,該操作能儘量取得多的資料。
下面看例子來解釋:
struct
{
char a;
int b;
char c;
}A;
通過sizeof可以得到結構體大小的結果為12。按照上述理解:cpu取一次資料是最小長度是4(因為 sizeof(int) = 4),它在獲得第1次資料後只能得到了成員a,它在獲得第2次資料後只能得到了成員b,它在獲得第3次資料後只能得到了成員c,記憶體中儲存與之相匹配,所以結果為4+4+4=12。
調整位置後新結構體:
struct
{
char a;
char c;
int b;
}B
通過sizeof可以得到結構體大小的結果為8。按照上述理解:cpu取一次資料是最小長度是4(因為 sizeof(int) = 4),它在獲得第1次資料後能得到了成員a和成員b,它在獲得第2次資料後能得到了成員c,記憶體中儲存與之相匹配,所以結果為4+4=8。
假如成員中有個double型別呢?
struct { char a; char c; double b; }C;
cpu取一次資料是最小長度還是4,因為32位機嘛。sizeof後的結果就是上一個例子加上4,4+4+4 = 12。
瞭解原理其它的就都會。