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。