什么是字节对齐?
本帖最后由 Anekys 于 2021-6-17 16:16 编辑首先来看一下百度百科的定义
字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,一个字节等于8位二进制数,在UTF-8编码中,一个英文字符等于一个字节。字节按照一定规则在空间上排列就是字节对齐。
字节对齐的目的是提高运行效率
CPU访问数据的效率问题。例如,假设一个处理器总是从存储器中取出8个字节,则地址必须为8的倍数。如果我们能保证将所有的double类型数据的地址对齐成8的倍数,那么就可以用一个存储器操作来读或者写值了。否则,我们可能需要执行两次存储器访问,因为对象可能被分放在两个8字节存储块中。
下面开始进入正文, 举个栗子
struct Test1
{
char a;
int b;
};
void main()
{
struct Test1 ceshi;
printf("%d\n",sizeof(ceshi));
}
上面这些代码你认为会输出什么?
很多人可能会觉得 一个char 2字节,一个int 4字节,整个结构体加到一起就是6字节
所以输出的是6
然而实际运行一下代码就会发现输出的是8,多出来两个字节
这多出来的两个字节,就是字节对齐所造成的的空间浪费.
回到代码上来,char占1个字节,int占4个字节这本身并没有错
但是由于这个结构体中宽度最大的是int是4(未指定参数情况下默认结构体中最宽的)
所以整个结构体是4字节对齐的,4字节对齐的效果,就是char虽然本身只占用2字节,但是实际划分的时候为其划分了4字节的空间,来保证字节对齐
char只占1个字节的,int是4个字节 Mine2019 发表于 2021-6-17 10:58
硬件越来越好,这些细节就考虑的越来越少
这个和硬件没有关系,不是说这样就省内存或者提高效率,是避免读取操作时读错 字节对齐后结构会变掉,造成不同编译的DLL接口或者读取目标文件结构出现问题,我都关掉的
同一个编译的项目中问题不大,可以提升性能 我看成了 什么是 字节跳动...... 我看成了 什么是 字节跳动..... 本帖最后由 小鸡炖提莫 于 2022-9-12 21:23 编辑
学到了,很有意义的知识 硬件越来越好,这些细节就考虑的越来越少 本帖最后由 无闻无问 于 2021-6-17 12:29 编辑
结构体大小是最大成员的整数倍…偏移是自身大小的整数倍… 学习了感谢分享!!!
页:
[1]
2