编译器内存对齐和_align的使用

https://blog.csdn.net/yhl_sophia/article/details/83375859

Strlen和Sizeof的区别

Strlen —— 获取能容纳所建立的最大对象的字节大小,一般在编译时就计算好了长度大小,故不能用来返回动态分配时的大小

Sizeof —— 返回字符串的长度大小,在运行时计算,返回的长度不包括NULL

编译器的内存对齐问题

成员对齐的规则:每个成员按自身类型大小和指定对齐参数(默认是8字节)中较小的那个对齐,且整个结构的长度大小必须为结构中所用到的所有对齐参数的整数倍,不够就补空字节。

#pragma pack (n)可以指定以n字节对齐

举例:

  Struct A

{

    char a;

    int b;

    short c;  

}

字节对齐的作用:数据存放进行对齐可以使CPU在访问数据时提高效率,减少进入内存的次数,同时也可避免不同硬件平台存取数据时发生错误。

_align(num)

—— 用于修改最高级别对象的字节边界,在汇编中使用LDRD或STRD时需要用到进行修饰限制,num取值可为2、4、8,不能用于结构体或者函数对象

当没有指定对齐方式时,看编译器的默认对齐字节,假设默认对齐字节是4,从0x0000地址开始存放数据,则进行分析:a是1个字节,比默认4字节小,故按照1字节对齐,即0x00000存放a数据;b是4字节,默认对齐字节也是4,故b按4字节对齐进行存储,从0x00040x0007存放b数据;c是2个字节,比默认4字节小,故按照2字节对齐,0x00080x0009存放c数据;此时一共用了10字节空间大小,不是最大对齐字节4的倍数,故要补齐,补到12,因此整个结构体A的Sizeof(A)即为12。

使用#pragma pack (2)指定2字节对齐,再次分析:a是1个字节,比指定对齐字节2小,因此按1字节对齐,0x0000存放a数据;b是4字节,但默认对齐字节2更小,因此按2字节对齐,从0x00020x0005存放b数据;c是2字节,按2字节对齐,0x00060x0007存放c数据,此时一共用了8个字节空间大小,是2的倍数,因此结构体A的Sizeof(A)大小为8。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值