No Memory Alignment with GCC

来源:互联网 发布:js代码提取网页信息 编辑:程序博客网 时间:2024/06/06 19:09
  1. attribute method:

    #include <stdio.h>struct packed{    char a;    int b;} __attribute__((packed));struct not_packed{    char a;    int b;};int main(void){    printf("Packed:     %zu\n", sizeof(struct packed));    printf("Not Packed: %zu\n", sizeof(struct not_packed));    return 0;}

    Output:

    $ make example && ./examplecc     example.c   -o examplePacked:     5Not Packed: 8
  1. pragma pack method:

    #include <stdio.h>#pragma pack(1)struct packed{    char a;    int b;};#pragma pack()struct not_packed{    char a;    int b;};int main(void){    printf("Packed:     %zu\n", sizeof(struct packed));    printf("Not Packed: %zu\n", sizeof(struct not_packed));    return 0;}

    Output:

    $ make example && ./examplecc     example.c   -o examplePacked:     5Not Packed: 8
  2. Add -fpack-struct to GCC
    -fpack-struct[=n]
    Without a value specified, pack all structure members together without holes. When a value is specified (which must be a small power of two), pack structuremembers according to this value, representing the maximum alignment (that is, objects with default alignment requirements larger than this will be outputpotentially unaligned at the next fitting location.

    Warning: the -fpack-struct switch causes GCC to generate code that is not binary compatible with code generated without thatswitch. Additionally, it makes the code suboptimal. Use it to conform to a non-default application binary interface.



0 0
原创粉丝点击