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)对齐)

  • 相关阅读:
    Android Studio库依赖问题
    Android学习笔记View的工作原理
    专用服务器模式&共享服务器模式
    Linux命令学习总结:shutdown
    Linux查看设置系统时区
    ORA-01950: no privileges on tablespace xxxx
    complex(x):创建一个复数
    python常用函数之--求绝对值函数:abs(x)
    python学习链接:
    requirejs学习博客址分享
  • 原文地址:https://www.cnblogs.com/flash610/p/3075170.html
Copyright © 2011-2022 走看看