Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188650
  • 博文数量: 54
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2018
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-31 23:14
文章存档

2014年(2)

2013年(52)

分类: 嵌入式

2013-08-15 20:43:23

一:字节对齐   sizeof(struct)   结构体大小 占内存大小
     关键点:对齐以地址能整除(内存地址值%类型字节数==0)为准;
    1, 默认对齐:
                内对齐:(成员对齐)针对结构体内部元素,具体数据存储的起始位置地址 能整除 该类型的字节大小,如int数据可以放在4的整数倍的地址,如果不能整除,则向后移(不是结构体首元素时,
                            浪费几个地址找到为止)如果含数组等则取元素字节宽度char a[3],占地3字节。
                            ——系统默认4字节为最大,超过取4.long long(8字节)则取4的倍数的地址开始放long long.
                            如:struct st{
                                        int b;
                                        char f;
                                        char a[3];
                                        }stu;
                                   sizeof(stu)=8;

                            如:struct st{ 
                                        int b;
                                        char a[3];
                                        long long c;

                                        }stu;
                                    sizeof(stu)=16;


                外对齐:(结构体对齐)按成员类型大小最大的对齐,在结构体尾部,如果地址不能整除最大值,则向后移找到为止。
                            ——系统默认4字节为最大,含有元素类型大于4则取4的倍数的尾地址结尾;若所含元素类型大小都小于4,则取元素中类型的最大值对齐。
    2, 按设置参数对齐:
           此外可以认为指定对齐方式;
            自定义对齐:          #pragma pack(x)   x:自己定义的字节对齐大小x取1,2,4,8,……
                                       

                                        #pragma pack(1)
                                        struct st{
                                                        char a[3];
                                                        short b;
                                                    }stu;
                                                 sizeof(stu)=5;

           自定义外对齐(地址对齐):
            特殊区分开默认对齐和自定义对齐,指定外对齐方式;  

                               
struct {} __attribute__((aligned(x))) 变量名;x:表示自定义结构体首地址(或尾地址)能整除x(上述的外地址)。
                               
阅读(1159) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~