zoukankan      html  css  js  c++  java
  • C、C++成员变量对齐

    http://www.cnblogs.com/nawind/articles/1339991.html

    http://blog.csdn.net/qiuqiu173/article/details/1968299

    struct MyStruct
    {
    double dda1;
    char dda;
    int type
    };

    sizeof(MyStruct)=16 (8+1+3(空白)+4)

    因为:

    在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。

    VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

    因此

    struct MyStruct
    {
    double dda1;
    char dda;
    int type
    };

    sizeof(MyStruct)=16 (8+1+3(空白)+4)

    struct MyStruct
    {
    char dda;
    double dda1;  
    int type
    };

    sizeof(MyStruct)=16 (1+7+8+4+4)

    VC 中提供了#pragma pack(n)来设定变量以n字节对齐方式(或者编译器更改了设置),那么

    成员的对齐要求为默认对齐要求和编译器设置对齐要求二者中的最小值。

    #pragma pack(push) //保存对齐状态
    #pragma pack(4)//设定为4字节对齐
    struct test
    {
    char m1;
    double m4;
    int m3;
    };

    sizeof(test)=16 (1+3+8+4)
    #pragma pack(pop)//恢复对齐状态

         如果把上面的#pragma pack(4)改为#pragma pack(16),

    sizeof(test)=24 (1+7+8+4+4)

         当结构体嵌套时,

              首先找到SA中成员的最大对齐边界,由于b是结构体类型,因此b的对齐边界取决于SB中的成员最大对齐边界:8。

    struct SB

    {
    int c;
    double k;
    short b;
    };
    struct SA
    {

    char g;
    SB b;
    char k;
    };

    sizeof(SB) = 24

    sizeof(SA) = 40

    总结如下,这里有三点很重要:
    1.每个成员分别按自己的方式对齐,并能最小化长度。
    2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
    3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。

  • 相关阅读:
    浅拷贝与深拷贝的实现
    Java批量下载生成zip文件
    jsp页面内容导出到Excel中
    Table动态增加删除行
    JavaScript校验日期格式
    java实现算术表达式求值
    XCode 4 编译错误大全整理
    VMWare安装黑苹果Mac OS
    ODA(Open Design Alliance)介绍
    AutoCAD 2010 开发与之前版本的区别
  • 原文地址:https://www.cnblogs.com/growup/p/2330296.html
Copyright © 2011-2022 走看看