1. 程式人生 > >結構體如何分配記憶體

結構體如何分配記憶體

基礎知識,其實是比較簡單的。(本文是以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。

瞭解原理其它的就都會。