zoukankan      html  css  js  c++  java
  • 内存对齐详细解释

    内存对齐详细解释

    如果结构体存储下标从0開始的

    先是依照#pragma pack(8)參数依次和数据成员比較:依照成员下标是比較结果中小者的倍数;

    最后再依照#pragma pack(8)參数与结构体成员占空间最大者比較,结构体总体的长度是比較结果中小者的倍数;

    1、分析说明:

    字节对齐(#pragma pack(2))

    输出结果:sizeof(structtest_t) = 10 [两个编译器输出一致]

    分析过程:

    1) 成员数据对齐

    #pragmapack(2)

    structtest_t {

    inta; /* 长度4> 2 按2 对齐;起始offset=00%2=0;存放位置区间[0,3]*/

    charb; /* 长度1< 2 按1 对齐;起始offset=44%1=0;存放位置区间[4]*/

    shortc; /* 长度2= 2 按2 对齐;起始offset=66%2=0。存放位置区间[6,7]*/

    chard; /* 长度1< 2 按1 对齐;起始offset=88%1=0;存放位置区间[8]*/

    };

    #pragmapack()

    成员总大小=9

    2) 总体对齐

    总体对齐系数=min((max(int,short,char), 2) = 2

    总体大小(size)=$(成员总大小)$(总体对齐系数)圆整= 10 /* 10%2=0 */

     

    2、实际样例:

    样例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    /*
    先是依照#pragmapack(2)參数依次和数据成员比較:依照两者之中小者对齐;
    最后再依照#pragmapack(2)參数与结构体成员占空间最大者比較,总体的长度是小者的倍数;
    */
    #pragma pack(4)
    struct test_1 {
           inta;             /* 长度4 =4  按4 对齐。起始offset=00%4=0;存放位置区间[0,3]*/
           charb;    /* 长度1 < 4 按1 对齐。起始offset=44%1=0;存放位置区间[4] */
           shortc;   /* 长度2 < 4 按2 对齐;起始offset=66%2=0。存放位置区间[6,7]*/
           chard;    /* 长度1 < 4 按1 对齐;起始offset=88%1=0;存放位置区间[8] */
                                /*总体要求:成员中占空间最大的与pack(4)比較,总体长度依照小者对其
                                   眼下总体length=9,而要求是4的倍数,因此结果须要是12
                                */
    };
    #pragma pack()
     
    #pragma pack(2)
    struct test_2 {
           inta;             /* 长度4 > 2 按2 对齐。起始offset=0 0%2=0。存放位置区间[0,3] */
           charb;    /* 长度1 < 2 按1 对齐;起始offset=44%1=0。存放位置区间[4] */
           shortc;   /* 长度2 = 2 按2 对齐;起始offset=6 6%2=0。存放位置区间[6,7] */
           chard;    /* 长度1 < 2 按1 对齐。起始offset=88%1=0;存放位置区间[8] */
                                /*总体要求:成员中占空间最大的与pack(2)比較,总体长度依照小者对其
                                   眼下总体length=9,而要求是2的倍数,因此结果须要是10
                                */
    };
    #pragma pack()
     
    int main(int argc, char *argv[])
    {
      printf("%d
    ", sizeof(struct test_1));
      printf("%d
    ", sizeof(struct test_2));
      return 0;
    }


    3、sizeof()測试结果:

    int (*ptr)[3]; //ptr代表指针,因此測得值为4

    int *ptr[3]; //ptr代表数组名,每一个成员是int * 。因此占3个*4=12

    ptr代表数组名时,測得是数组所占内存空间的大小

    ptr代表指针名时,測得是指针变空间由内存大小占用量

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    线程模型及线程池原理
    Python装饰器
    CentOS下yum源配置
    Windows下右键增加Typora选项
    Python批量修改文件名
    《财务自由之路》读后感
    python字典练习01
    《亲密关系》读后感
    Git远程仓库
    《生命是什么》读后感
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4913892.html
Copyright © 2011-2022 走看看