加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C++如何设置字节对齐

(2018-01-24 10:50:50)
标签:

c

字节对齐

分类: c
目前普遍使用的是两种方式:
第一种:
#pragma pack(n) // 编译器将按照n个字节对齐。  
#pragma pack()  // 取消自定义字节对齐方式(取消后恢复到编译器默认的对齐方式)。 

第二种:
#pragma pack (push,n)    // 把原来对齐方式设置压栈,并设新的对齐方式为n个字节对齐  
#pragma pack(pop)        // 恢复原来对齐方式 

从上面两点来看#pragma pack(n)与#pragma pack (push,n)来看,他们之间的区别并不大,可以相互代替,只是后者恢复时是恢复到了原来的对齐方式,而前者是恢复到了编译器默认的对齐方式。推荐使用后者。

  1. #include   
  2. // 采用默认的字节对齐方式, 即t1中最长的类型int, 即4字节对齐  
  3. struct t1  
  4.  
  5.     char c;  
  6.     int i;  
  7.     short s;  
  8.     float f;  
  9.     char c1;  
  10. };  
  11.   
  12. #pragma pack(2)         // 编译器将按照2个字节对齐  
  13.   
  14.     // 2字节对齐  
  15.     struct t2     
  16.      
  17.         char c;  
  18.         int i;  
  19.         short s;  
  20.         float f;  
  21.         char c1;  
  22.     };  
  23.   
  24.     #pragma pack(push, 1)  // 把原来对齐方式(2字节)置压栈,并设新对齐方式为1字节  
  25.   
  26.         // 1字节对齐  
  27.         struct t3     
  28.          
  29.             char c;  
  30.             int i;  
  31.             short s;  
  32.             float f;  
  33.             char c1;  
  34.         };  
  35.   
  36.         #pragma pack(2)     // 编译器将按照2个字节对齐  
  37.   
  38.             // 2字节对齐  
  39.             struct t4        
  40.              
  41.                 char c;  
  42.                 int i;  
  43.                 short s;  
  44.                 float f;  
  45.                 char c1;  
  46.             };  
  47.   
  48.         #pragma pack()      // 取消自定义字节对齐(2字节)方式, 采用默认字节对齐方式  
  49.   
  50.         // 采用默认的字节对齐方式, 即t5中最长的类型int, 即4字节对齐  
  51.         struct t5         
  52.          
  53.             char c;  
  54.             int i;  
  55.             short s;  
  56.             float f;  
  57.             char c1;  
  58.         };  
  59.   
  60.   
  61.     #pragma pack(pop)       // 取消1字节对齐方式。恢复到原来的2个字节对齐方式  
  62.   
  63.     // 2字节对齐  
  64.     struct t6         
  65.      
  66.         char c;  
  67.         int i;  
  68.         short s;  
  69.         float f;  
  70.         char c1;  
  71.     };  
  72.   
  73. #pragma pack()          // 取消自定义字节对齐(2个字节)方式, 采用默认的字节对齐方式  
  74.   
  75. // 采用默认的字节对齐方式, 即t7中最长的类型int, 即4字节对齐  
  76. struct t7     
  77.  
  78.     char c;  
  79.     int i;  
  80.     short s;  
  81.     float f;  
  82.     char c1;  
  83. };  
  84.   
  85. int main()  
  86.  
  87.     printf("sizeof(char): %d\n"sizeof(char));  
  88.     printf("sizeof(short): %d\n"sizeof(short));  
  89.     printf("sizeof(int): %d\n"sizeof(int));  
  90.     printf("sizeof(float): %d\n"sizeof(float));  
  91.   
  92.     printf("\n=======================================\n\n");  
  93.   
  94.     printf("sizeof(t1): %d\n"sizeof(t1));  
  95.     printf("sizeof(t2): %d\n"sizeof(t2));  
  96.     printf("sizeof(t3): %d\n"sizeof(t3));  
  97.     printf("sizeof(t4): %d\n"sizeof(t4));  
  98.     printf("sizeof(t5): %d\n"sizeof(t5));  
  99.   
  100.     printf("sizeof(t6): %d\n"sizeof(t6));  
  101.     printf("sizeof(t7): %d\n"sizeof(t7));  
  102.   
  103.     return 0;  
  104.  
  105.   
  106.  


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有