对齐系数 #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中最大数据成员长度中比较小的那个进行;


先局部成员对齐,然后再全局对齐。

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