吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1633|回复: 12
收起左侧

[其他转载] 什么是字节对齐?

[复制链接]
Anekys 发表于 2021-6-17 09:58
本帖最后由 Anekys 于 2021-6-17 16:16 编辑

首先来看一下百度百科的定义
字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,一个字节等于8位二进制数,在UTF-8编码中,一个英文字符等于一个字节。字节按照一定规则在空间上排列就是字节对齐。

字节对齐的目的是提高运行效率
CPU访问数据的效率问题。例如,假设一个处理器总是从存储器中取出8个字节,则地址必须为8的倍数。如果我们能保证将所有的double类型数据的地址对齐成8的倍数,那么就可以用一个存储器操作来读或者写值了。否则,我们可能需要执行两次存储器访问,因为对象可能被分放在两个8字节存储块中。


下面开始进入正文, 举个栗子
[C] 纯文本查看 复制代码
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字节的空间,来保证字节对齐


免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
egbert_tao + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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接口或者读取目标文件结构出现问题,我都关掉的
同一个编译的项目中问题不大,可以提升性能

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Anekys + 1 + 1 我很赞同!

查看全部评分

不言谢c 发表于 2021-6-17 10:10
我看成了 什么是 字节跳动......
liuyanjie2012 发表于 2021-6-17 10:24
我看成了 什么是 字节跳动.....
小鸡炖提莫 发表于 2021-6-17 10:47
本帖最后由 小鸡炖提莫 于 2022-9-12 21:23 编辑

学到了,很有意义的知识

免费评分

参与人数 1吾爱币 -1 收起 理由
侃遍天下无二人 -1 帖子写的和你说的有关系吗,别灌水

查看全部评分

Mine2019 发表于 2021-6-17 10:58
硬件越来越好,这些细节就考虑的越来越少
无闻无问 发表于 2021-6-17 12:27
本帖最后由 无闻无问 于 2021-6-17 12:29 编辑

结构体大小是最大成员的整数倍…偏移是自身大小的整数倍…
lyslxx 发表于 2021-6-17 13:03
学习了  感谢分享!!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表