zoukankan      html  css  js  c++  java
  • (C)字节对齐#pragma pack()

    1. 为什么要进行对齐


    对于结构体,编译器会自动进行成员变量对齐处理,是为了提高运算效率。
    缺省情况下是自然对齐方式。

    2. 自然对齐


    即默认对齐,按照结构体的成员中size最大的成员进行对齐。
    例:

    struct naturalalign
    {
        char a;
        short b
        int c;
    };

    上述结构体,成员size最大的是c,sizeof(c)为4,因此,结构体中的成员都以4为单位进行对齐,sizeof(naturalalign)为12.

    3. 指定对齐


    即按照指定的字节大小进行对齐。
    使用伪指令:
    #pragma pack(N); //按照N个字节进行对齐
    #pragma pack();//取消指定对齐
    注:
    如果N大于结构体中最大成员的size,则不起作用。仍然以默认方式对齐。
    例:

    #pragma pack(N)
    struct natural
    {
        char a;
        int b;
        char c;
    };
    #pragma pack();

    当N分别为4,8,16时,其对齐方式是一样的。sizeof(natural)都为12;
    当N为2时,sizeof(natural)为6.

    4. Intel1.微软面试题


    #pragma pack(8)
    struct example1
    {
        short a;
        long b;
    };
    struct example2
    {
        char c;
        example1 struct1;
        short e;
    };
    #pragma pack();
    
    int main(int argc,char*argv[])
    {
        example2 struct2;
        cout<<sizeof(example1)<<endl;
        cout<<sizeof(example2)<<endl;
        cout<<(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)<<endl;
        return 0;
    }

    问:程序输出结果?
    分析:
    struct example1中成员最大size为4,故指定对齐8不起作用。

        sizeof(example1) = 4*2 = 8;
    

    struct example2中包含struct example1,其本身成员最大size为2,而example1中的成员最大size为4,指定对齐8也不起作用。,

        sizeof ( example2 )   = 4*4 = 16;
    

    由于struct example2中成员以4为单位对界,因此,char变量c后应该补充3个bit,后面才是struct1的地址,故最后输出结果为4.

  • 相关阅读:
    第七届蓝桥杯JavaA组省赛真题
    第七届蓝桥杯JavaA组省赛真题
    第七届蓝桥杯JavaA组省赛真题
    第七届蓝桥杯JavaA组省赛真题
    Qt自定义model
    Qt Model/View(官方翻译,图文并茂)
    ddd
    java整合spring和hadoop HDFS
    hadoop-2.7.3 在windows环境下安装(无需Cygwin)
    Web Api 自动生成帮助文档
  • 原文地址:https://www.cnblogs.com/yanghong-hnu/p/5699703.html
Copyright © 2011-2022 走看看