• 结构体的对齐


     

    本文摘自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)对齐)

  • 相关阅读:
    ThinkPhp框架分页查询和部分框架知识
    tp框架增删改
    WAMP中mysql服务突然无法启动 解决方法
    thinkphp框架 的 链接数据库和操作数据
    php 全局使用laravel的dd和dump
    给centos装图形界面 widowsx
    marquee标签的使用
    微信公众号开发入门教程
    laravel admin引入css js报错 https
    利用Croppie裁剪图片并后台保存
  • 原文地址:https://www.cnblogs.com/flash610/p/3075170.html
Copyright © 2020-2023  润新知