C/C++内存对齐

  1. 云栖社区>
  2. 博客>
  3. 正文

C/C++内存对齐

feilengcui008 2015-03-09 15:40:00 浏览844
展开阅读全文

有时会在c/c++中看到这种形式

#pragma pack(n)
#pragma pack()

前一句代表设置对齐的字节数为n,而不是编译器默认的对齐字节数(ubuntu 14.04 x86_64下为8),后一句代表恢复默认值,合理地使用内存对齐能减少程序占用的内存空间,使用不当也会降低存取效率从而降低程序性能。在分析内存对齐时,只需要采用以下的原则,这里以一段代码简单解释下

#include <stdio.h>
#include <stdlib.h>


int main()
{
    //缺省,一般8字节对齐
    //struct有成员字节大于pack值,对齐为pack的整数倍=>24
    struct default_pack_struct_size_bigger {
        struct c {
            long long a;
            char d;
        } m;
        char b;
    };
    printf("default_pack_struct_size_bigger:%d\n",(int)sizeof(struct default_pack_struct_size_bigger));
    //struct成员字节数都小于pack,按字节数最大的对齐=>4
    struct default_pack_struct_size_smaller {
        char a;
        short int b;
    };
    printf("default_pack_struct_size_smaller:%d\n",(int)sizeof(struct default_pack_struct_size_smaller));


    //设置pack为4
    #pragma pack(4)
    //结构成员有大于4字节的 => 12
    struct pack_4_struct_size_bigger {
        unsigned short int a;
        long long b;
    };
    printf("pack_4_struct_size_bigger:%d\n",(int)sizeof(struct pack_4_struct_size_bigger));
    //结构成员都小于4字节 => 4 
    struct pack_4_struct_size_smaller {
        char a;
        unsigned short int b;
    };
    printf("pack_4_struct_size_smaller:%d\n",(int)sizeof(struct pack_4_struct_size_smaller));
    #pragma pack()

    return 0;
}

结果:

网友评论

登录后评论
0/500
评论
feilengcui008
+ 关注