码迷,mamicode.com
首页 > 其他好文 > 详细

关于内存对齐

时间:2015-03-09 16:14:20      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:c-c++   linux内核   

有时会在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;
}

结果:
技术分享

关于内存对齐

标签:c-c++   linux内核   

原文地址:http://blog.csdn.net/feilengcui008/article/details/44155541

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!