新浦京81707con > 首页 > 结构体在内存中的对其规则,结构体在内存中的

原标题:结构体在内存中的对其规则,结构体在内存中的

浏览次数:82 时间:2019-11-13

结构体在内部存款和储蓄器中的对齐准绳,结构体对齐准绳

小说转自:

随笔不错,老妪能解,特此分享。

 

三个结构体变量定义完事后,其在内部存款和储蓄器中的存款和储蓄并不等于其所含有元素的上涨的幅度之和。

例一:

                                      #include <iostream>

                                      using namespace std;

                                         struct X

                                         {

                                              char a;

                                              int b;

                                              double c;

                                         }S1;

 

                                     void main()

                                    {

                                         cout << sizeof(S1) << endl;

                                         cout << sizeof(S1.a) << endl;

                                         cout << sizeof(S1.b) << endl;

                                         cout << sizeof(S1.c) << endl;

                                    }

     比方例第一中学的结构体变量S1定义之后,经测验,会开掘sizeof(S1卡塔尔国= 16,其值不等于sizeof(S1.a) = 1、sizeof(S1.b) = 4和 sizeof(S1.c) = 8三者之和,这里面就存在存储对齐难点。

    原则一:结构体九月素是规行矩步定义顺序多少个叁个内置内部存款和储蓄器中去的,但并不是牢牢排列的。从结构体存款和储蓄的首地址开首,每三个要素放置到内部存款和储蓄器中时,它都会以为内存是以它和谐的分寸来划分的,因而成分放置的地点一定会在融洽宽度的整数倍上上马(以结构体变量首地点为0计量卡塔尔。

    譬如此例,首先系统会将字符型变量a存入第0个字节(相对地址,指内部存款和储蓄器开发的首地址卡塔 尔(阿拉伯语:قطر‎;然后在贮存整形变量b时,会以4个字节为单位展开仓储,由于第二个四字节模块原来就有数量,因而它会存入第四个四字节模块,约等于存入到4~8字节;同理,存放双精度实型变量c时,由于其上升的幅度为8,其存放时会以8个字节为单位存款和储蓄,也正是会找到第三个空的且是8的整几倍的岗位上马积攒,此例中,此例中,由于头三个8字节模块已被占用,所以将c存入第二个8字节模块。全部存款和储蓄暗暗提示图如图1所示。

图片 1

    思忖此外八个实例。

例二:

                                           struct X

                                           {

                                                char a;

                                                double b;

                                                int c;

                                            }S2;

    在例二中不过是将double型的变量和int型的变量沟通了岗位。测量试验程序不改变,测验结果却浑然分歧,sizeof(S2)=24,分裂于大家遵照标准后生可畏计算出的8 8 4=20,那就引出了我们的第二法规。

   

 

    原则二:在经过第意气风发尺码解析后,检查总计出的存款和储蓄单元是不是为具有因素中最宽的因素的长度的平头倍,是,则甘休;若不是,则补齐为它的整好好几倍。

    例二中,我们解析完后的储存长度为20字节,不是最宽成分长度8的卡尺头倍,由此将它补齐到8的整数倍,也正是24。那样就没难题了。其储存暗示图如图2所示。

 图片 2

    明白了那三个标准,就可以分析全部数据存款和储蓄对齐问题了。再来看多少个例子,应用以上三个原则来剖断。

例三:

                                              struct X

                                              { 

                                                   double a;

                                                   char b;

                                                   int c;     

                                              }S3;

    首先根据标准一来解析。遵照定义的逐一,先存款和储蓄double型的a,存款和储蓄在第0~7个字节;其次是char型的b,存款和储蓄在第8个字节;接下去是int型的c,顺序检查后开采前方四个四字节模块都被挤占,因而储存在第二个四字节模块,约等于第12~15字节。遵照第风度翩翩尺码解析得到16个字节,16刚巧是最宽成分a的宽窄8的卡尺头倍,因而结构体变量S3所占存款和储蓄空间就是17个字节。存款和储蓄结构如图3所示。

 图片 3例四:

                                              struct X

                                              { 

                                                   double a;

                                                   char b;

                                                   int c;

                                                   char d;   

                                              }S4;

 

    照旧第风华正茂遵照第生龙活虎标准剖析,得到的字节数为8 4 4 1=17;再依照第二原则补齐,则结构体变量S4所占存款和储蓄空间为24。存款和储蓄结构如图4所示:

 图片 4例五:

                                              struct X

                                              { 

                                                   double a;

                                                   char b;

                                                   int c;

                                                   char d;

                                                   int e; 

                                               }S5;

    雷同结合原则风流浪漫和条件二剖判,可以预知在S4的基础上在结构体内部变量定义最终步向叁个int型变量后,结构体所占空间未有增添,仍然为24。存款和储蓄结构暗示图如图5所示。

图片 5

例六:

    若是将例五中到场的变量e放到第二个概念的地点,则情形就不一致了。结构体所占存款和储蓄空间会形成32。其积攒结构暗指图如图6所示。

                                              struct X

                                              { 

                                                  int e;

                                                  double a;

                                                  char b;

                                                  int c;

                                                  char d;

                                              }S6;

 图片 6

    补充:前边所介绍的皆以因素为骨干数据类型的结构体,那么带有指针、数组或是此外结构体变量或联合体变量时该怎么呢?

    1.带有指针类型的动静。只要记住指针本人所占的仓储空间是4个字节就可以了,而无需看它是指向哪些类型的指针。

例七:

                    struct X              struct Y               struct Z

                    {                     {                      {     

                       char *a;              int *b;                 double *c;

                    };                     };                     };

    经测验,可见sizeof(X)、sizeof(Y)和sizeof(Z)的值都为4。

    2.分包构造数据类型(数组、结构体和联合体卡塔 尔(英语:State of Qatar)的场地。首先要鲜明的是总结存款和储蓄空间时要把构造体看作多个全体来为其开采存款和储蓄空间;其次要明了的是在最后补齐时是根据持有因素中的基本数据类型元素的最长度宽度度来补齐的,相当于说固然要把构造体看作全体,但在补齐的时候并不会依照所含结构体所占存款和储蓄空间的长度来补齐的(尽管它或者是最长的卡塔尔。

例八:

                                      struct X

                                     {

                                          char a;

                                          int b;

                                          double c;

                                      };

                                      struct Y

                                      {

                                           char a;

                                           X b;

                                       };

    经测量试验,可以知道sizeof(X)为16,sizeof(Y)为24。即总计Y的囤积长度时,在寄存第3个因素b时的启幕地方是在double型的尺寸8的整数倍处,而非16的子弹头倍处,即系统为b所分配的蕴藏空间是第8~23个字节。

    假诺将Y的三个要素char型的a和X型的b沟通定义顺序,则系统为b分配的存款和储蓄地点是第0~15个字节,为a分配的是第17个字节,加起来总共拾八个字节,不是最长基本类型double所占宽度8的整好几倍,因而要补齐到8的大背头倍,即24。测量试验后可得sizeof(Y)的值为24。

    由于结构体所占空间与其内部因素的档期的顺序有关,况兼与不一致类别元素的排列有关,因而在概念结构体时,在要素类型及数码鲜明以后,大家还应当专心一下其内部因素的定义顺序。

随笔转自: 文章不错,老妪能解,特此分享。 叁个结...

                                                   char b;

                                              { 

                                                   int c;

                                         cout << sizeof(S1.a) << endl;

                                                  int e;

                                       };

                                            }S2;

                                         cout << sizeof(S1.b) << endl;

 图片 7例四:

                                           {

                                           X b;

    原则二:在通过第一条件剖判后,检查总结出的存款和储蓄单元是还是不是为具有因素中最宽的因素的长度的整好数倍,是,则结束;若不是,则补齐为它的大背头倍。

                                                  int c;

图片 8

                                         cout << sizeof(S1.c) << endl;

                                                   int c;

叁个结构体变量定义完事后,其在内部存款和储蓄器中的存款和储蓄并不等于其所包括成分的幅度之和。

例七:

                                                   char b;

例八:

                                           char a;

    2.带有构造数据类型(数组、结构体和联合体卡塔 尔(英语:State of Qatar)的情景。首先要显然的是计量存款和储蓄空间时要把构造体看作贰个完好来为其开拓存款和储蓄空间;其次要掌握的是在终极补齐时是奉公守法具备因素中的基本数据类型成分的最长宽度来补齐的,也正是说即使要把构造体看作全体,但在补齐的时候并不会固守所含结构体所占存款和储蓄空间的长度来补齐的(纵然它或者是最长的卡塔尔国。

    补充:前边所介绍的都是因素为主导数据类型的结构体,那么带有指针、数组或是其它结构体变量或联合体变量时该怎么着呢?

                                      {

                                              struct X

                                         }S1;


1

    原则黄金年代:结构体兰秋素是鲁人持竿定义顺序四个叁个置于内部存款和储蓄器中去的,但并非大器晚成体排列的。从结构体存款和储蓄的首地址早先,每多少个要素放置到内部存储器中时,它都会感到内存是以它本人的大小来划分的,因而成分放置的岗位一定会在协调宽度的莫西干发型倍上在此以前(以结构体变量首地方为0乘除卡塔 尔(阿拉伯语:قطر‎。

                                      };