我写了一个结构,他里面是4字节对齐的,如何取消这种对齐?struct test{
  char a[9];
  float b;
}

解决方案 »

  1.   

    按Tab让vc自动对齐,比如,
    char“按tab” a[9]
    float“按tab” b;
      

  2.   

    我只知道C++ Builder里可以在 Project\Options\Advanced Compiler里设,VC++估计也是在Project属性里可以设置吧
      

  3.   

    pack
    #pragma pack([n])
    该指令指定结构和联合成员的紧凑对齐。而一个完整的转换单元的结构和联合
    的紧凑对齐由/Zp选项设置。紧凑对齐用pace编译指示在数据说明层设置。该编译指示在其出现后的第一个结构或联合说明处生效。该编译指示对定义无效。当你使用#pragma pack(n)时,这里n为1、2、4、8或16。第一个结构成员之后的每个结构成员都被存储在更小的成员类型或n字节界限内。如果你使用无参量的#pragma pack,结构成员被紧凑为以/Zp指定的值。该缺省/Zp紧凑值为/Zp8。
    编译器也支持以下增强型语法:
    #pragma pack([[{push|pop},][标识符,]][n])
    若不同的组件使用pack编译指示指定不同的紧凑对齐,这个语法允许你把程序组件组合为一个单独的转换单元。
    带push参量的pack编译指示的每次出现将当前的紧凑对齐存储到一个内部编译器堆栈中。编译指示的参量表从左到右读取。如果你使用push,则当前紧凑值被存储起来;如果你给出一个n的值,该值将成为新的紧凑值。若你指定一个标识符,即你选定一个名称,则该标识符将和这个新的的紧凑值联系起来。
    带一个pop参量的pack编译指示的每次出现都会检索内部编译器堆栈顶的值,并且使该值为新的紧凑对齐值。如果你使用pop参量且内部编译器堆栈是空的,则紧凑值为命令行给定的值,并且将产生一个警告信息。若你使用pop且指定一个n的值,该值将成为新的紧凑值。
    若你使用pop且指定一个标识符,所有存储在堆栈中的值将从栈中删除,直到找到一个匹配的标识符,这个与标识符相关的紧凑值也从栈中移出,并且这个仅在标识符入栈之前存在的紧凑值成为新的紧凑值。如果未找到匹配的标识符,将使用命令行设置的紧凑值,并且将产生一个一级警告。缺省紧凑对齐为8。
    pack编译指示的新的增强功能让你编写头文件,确保在遇到该头文件的前后的紧凑值是一样的。
    /* File name: include1.h*/
    #pragma pack(push,enter_include1)
    /* 你的包括文件代码... */
    #pragma pack(pop, enter_include1)
    /* include1.h结束 */
    在上面的例子中,当前紧凑值与标识符enter_include1联系起来,并被压入头文件的项中。头文件末尾的pack编译指示删除所有可能出现在头文件中的干预紧凑值,并且删除与enter_include1相关的紧凑值。因此确保该头文件的前后的紧凑值是相同的。
    这种新功能也允许你使用代码,例如头文件,它可以使用pack编译指示设置不同于在你的代码中设置的紧凑值的紧凑对齐:
    #pragma pack(push,before_include1)
    #include "include1.h"
    #pragma pack( pop,before_include1)
    在上面的例子中,对于出现在include.h中的紧凑值的任何变化,你的代码是受到保护的。
      

  4.   

    #pragma pack(push,1)
    struct test{
      char a[9];
      float b;
    };
    #pragma pack(pop)