zoukankan      html  css  js  c++  java
  • 关于C语言中结构体大小计算

    结构体大小的计算,。网上说法一大堆还都不一样分什么对齐不对齐,偏移量什么的。。
    在此稍微举例简单总结下:
    对齐原则:每一成员的结束偏移量需对齐为后一成员类型的倍数 
    补齐原则:最终大小补齐为成员中最大值的倍数
     
    拿个题目做例子:【(开始偏移量)+此处字节 = 结束偏移量
     1 struct MyStruct
     2 {
     3     int i; // (0) + 4 = 4,后面一个为2,已经对齐
     4     char c;  // (4) + 1 = 5,后面一个为结构体,直接拆开看第一个,int=4,所以对齐为(4) + 4 = 8
     5     struct InnerStruct
     6     {
     7         int i;  // (8) + 4 = 12,下一个为4,已经对齐(学java注意了,32位下C语言的long为4,和java不一样)
     8         long l;  //  (12) + 4 = 16,下一个为8,已经对齐
     9         double d;  //  (16) + 8 = 24,下一个为1,已经对齐
    10         char c;  //  (24) + 1 = 25,这是最后一个,将其对齐为最大值8的倍数,所以补齐为 (24) + 8 = 32,最后结果=32
    11     } innerStruct;
    12 };  
    【注意】如果指定对齐字节,则在对齐的时候将此指定与下一个的进行比较,取较小的那个进行对齐。
                    在补齐的时候,与最大的进行比较,也取较小的那一个进行补齐。
    代码如下:
     1 struct A {
     2     char  b;
     3     int   a;
     4     short c;
     5 };
     6 
     7 #pragma pack (2) /*指定按2字节对齐*/
     8 struct B {
     9     char  b;
    10     int   a;
    11     short c;
    12 };
    13 #pragma pack () /*取消指定对齐,恢复缺省对齐*/
    14 
    15 
    16 
    17 #pragma pack (1) /*指定按1字节对齐*/
    18 struct C {
    19     char  b;
    20     int   a;
    21     short c;
    22 };
    23 #pragma pack ()/*取消指定对齐,恢复缺省对齐*/
    24 
    25 //计算所占字节
    26     int s1=sizeof(struct A);
    27     int s2=sizeof(struct B);
    28     int s3=sizeof(struct C);
    29     
    30     printf("%d
    ",s1);
    31     printf("%d
    ",s2);
    32     printf("%d
    ",s3);
    输出结果:
    12  //按下一个进行对齐,按最大进行补齐
    8   //按2进行对齐和补齐 
    7   //按1进行对齐和补齐,相当于直接计算每个大小然后相加
     
  • 相关阅读:
    毕设进度21
    毕设进度20
    Javascript高级程序设计第三版-笔记
    前端踩过的坑
    thinkphp笔记
    PHP 发邮件《转》
    smarty笔记
    jquery笔记
    JS笔记
    php万年历
  • 原文地址:https://www.cnblogs.com/Xieyang-blog/p/8724478.html
Copyright © 2011-2022 走看看