zoukankan      html  css  js  c++  java
  • 结构体的对齐

     

    本文摘自robinh00d  http://www.cnblogs.com/robinh00d/archive/2010/03/06/1679675.html

     

    结构体对齐浅析

     

    个人理解,如有误,请指正。

    一 结构体内成员的的对齐
    成员的地址要按照成员的大小来对齐 比如int 类型的数据的地址要按照sizeof(int)对齐
    比如
    typedef struct _s
    {
        char a;
        int b;

    }s;

    sizeof(s) = 8

    除了要考虑结构体内成员的地址对齐 还要考虑结构体自身的对齐,原因就是因为当多个结构体成员存在的时候(结构体数组),
    如果结构体自身不对齐 会造成数组里的其他结构体内的成员变量地址无法对齐。

    二 结构体自身的对齐

    1.如果没有明确写上paragma pack(x)结构体自身就按照结构体里最大成员长度对齐
    比如
    typedef struct _FILE_BASIC_INFORMATION
    {
        LARGE_INTEGER    CreationTime;    //8字节
        LARGE_INTEGER    LastAccessTime;  //8字节
        LARGE_INTEGER    LastWriteTime;   //8字节
        LARGE_INTEGER    ChangeTime;      //8字节
        USHORT        FileAttributes;  //4字节
    }FILE_BASIC_INFORMATION;

    sizeof(FILE_BASIC_INFORMATION) = 40
    整个结构体按sizeof(LARGE_INTEGER)对齐

    2.如果明确写上paragma pack(x)则又分为两种情况:

    a.如果x小于结构体长度最大的成员的长度 则按x对齐
    比如
    pragma pack(4)
    typedef struct _FILE_BASIC_INFORMATION
    {
        LARGE_INTEGER    CreationTime;    //8字节
        LARGE_INTEGER    LastAccessTime;  //8字节
        LARGE_INTEGER    LastWriteTime;   //8字节
        LARGE_INTEGER    ChangeTime;      //8字节
        USHORT        FileAttributes;  //4字节
    }FILE_BASIC_INFORMATION;

    sizeof(FILE_BASIC_INFORMATION) = 36(按4对齐而不是按sizeof(LARGE_INTEGER)

    b.如果x大于结构体长度最大的成员的长度 则按结构体里长度最长成员长度对齐
    比如
    pragma pack(8)
    typedef struct _x
    {
        char a;
        short b;
    }x;
    sizeof(x) = 4 (按sizeof(short)对齐)

  • 相关阅读:
    浅谈ES6
    iframe的应用
    vue时时监听input输入框中 输入内容 写法
    点击模态框滑动出来 抽屉
    this.$router 和this.$route 的区别
    iview框架 两侧弹框 出现第二层弹框 一闪而过的问题
    input框中的必填项之取消当前input框为必填项
    v-model 的修饰符
    单页面开发和多页面开发的优缺点
    原型继承+借用构造函数继承 的一些理解
  • 原文地址:https://www.cnblogs.com/flash610/p/3075170.html
Copyright © 2011-2022 走看看