對齊係數 #pragma pack(k)


下面兩個結構體
  1. struct One{  
  2.     double d;  
  3.     char c;  
  4.     int i;  
  5. }  
  6. struct Two{  
  7.     char c;  
  8.     double d;  
  9.     int i;  
  10. }  
struct One{
    double d;
    char c;
    int i;
}
struct Two{
    char c;
    double d;
    int i;
}


在#pragma pack(4)和#pragma pack(8)的情況下,結構體的大小分別是

正確答案: C   你的答案: C (正確)

16 24,16 24
16 20,16 20
16 16,16 24
16 16,24 24



許多實際的計算機系統對基本類型數據在內存中存放的位置有限制,它們會要求這些數據的首地址的值是某個數k(通常它爲4或8)的倍數,這就是所謂的內存對齊。


每個特定平臺上的編譯器都有自己的默認“對齊係數”(32位機一般爲4,64位機一般爲8)。我們可以通過預編譯命令#pragma pack(k),k=1,2,4,8,16來改變這個係數,其中k就是需要指定的“對齊係數”;也可以使用#pragma pack()取消自定義字節對齊方式。


struct 或者 union 成員對齊規則如下:


1. 第一個數據成員放在offset爲0的地方,對齊按照對齊係數和自身佔用字節數中,二者比較小的那個進行對齊;

2. 在數據成員完成各自對齊以後,struct或者union本身也要進行對齊,對齊將按照對齊係數和struct或者union中最大數據成員長度中比較小的那個進行;


先局部成員對齊,然後再全局對齊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章