Anekys 发表于 2021-6-17 09:58

什么是字节对齐?

本帖最后由 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字节的空间,来保证字节对齐


pikachu888 发表于 2021-6-17 13:48

char只占1个字节的,int是4个字节

ticastle 发表于 2021-6-17 11:23

Mine2019 发表于 2021-6-17 10:58
硬件越来越好,这些细节就考虑的越来越少

这个和硬件没有关系,不是说这样就省内存或者提高效率,是避免读取操作时读错

JuncoJet 发表于 2021-6-17 10:00

字节对齐后结构会变掉,造成不同编译的DLL接口或者读取目标文件结构出现问题,我都关掉的
同一个编译的项目中问题不大,可以提升性能

不言谢c 发表于 2021-6-17 10:10

我看成了 什么是 字节跳动......

liuyanjie2012 发表于 2021-6-17 10:24

我看成了 什么是 字节跳动.....

小鸡炖提莫 发表于 2021-6-17 10:47

本帖最后由 小鸡炖提莫 于 2022-9-12 21:23 编辑

学到了,很有意义的知识

Mine2019 发表于 2021-6-17 10:58

硬件越来越好,这些细节就考虑的越来越少

无闻无问 发表于 2021-6-17 12:27

本帖最后由 无闻无问 于 2021-6-17 12:29 编辑

结构体大小是最大成员的整数倍…偏移是自身大小的整数倍…

lyslxx 发表于 2021-6-17 13:03

学习了感谢分享!!!
页: [1] 2
查看完整版本: 什么是字节对齐?