[求助] 请教一下,字节对齐的问题,是字节多的变量定义在前面,字节少变量定义在后面吗

一沙一世   2022-11-25 10:12 楼主

请教一下,字节对齐的问题,是字节多的变量定义在前面,字节少变量定义在后面吗

回复评论 (7)

『字节对齐的问题,是字节多的变量定义在前面,字节少变量定义在后面吗』

字节对齐,不是这个意思吧?没有什么 “字节多的变量定义在前面,字节少变量定义在后面”。

点赞  2022-11-25 10:23

程序中可能定义了若干个一字节变量、若干个二字节变量、若干个四字节变量……编译器只是为这些不同长度的变量按照定义的先后指定首地址,并不区分哪个在低地址哪个在高地址。

点赞  2022-11-25 10:35

不应该这么设计,得看你的系统是几个字节对齐的,如果是4字节对齐,那么就应该尽量让一些小于四字节的变量凑在一起能够组成4个自己。

比如有变量字节数为 1 1 2 2 4 4

那么就不要 设计成 1 4 1 4 2 2 这种

你可以先自行理解一下。

点赞  2022-11-25 10:54
引用: wangerxian 发表于 2022-11-25 10:54 不应该这么设计,得看你的系统是几个字节对齐的,如果是4字节对齐,那么就应该尽量让一些小于四字节的变量 ...

尽量让那些小字节的变量在一块,1+1+2等于4,那么这些变量就刚好4字节对齐了。

或者可以强制1 2 4等字节对齐,这个你可以搜一下,研究研究~

点赞  2022-11-25 10:56

两个事情:字节对齐和大小端

 

字节对齐的问题:字节按照一定规则在空间上排列就是字节对齐。字节对齐的好处:提高效率,节省空间。

比如32位的处理器总线访问内存。每个周期从偶地址开始访问32位内存数据,内存数据以字节为单位存放。如果一个32位的数据没有存放在4字节整除的内存地址处,处理器就需要2个总线周期访问,效率下降。

为使CPU能够对数据进行快速访问,数据的起始地址应具有“对齐”特性。比如4字节数据的起始地址应位于4字节边界上,即起始地址能够被4整除。

字节对齐可以地节省存储空间。

 

大小端模式定义。

Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

STM32:小端模式
STM8:大端
KEIL C51:大端
x86:小端
ARM既可以工作在大端模式,也可以工作在小端模式

本帖最后由 damiaa 于 2022-11-25 11:04 编辑
点赞  2022-11-25 11:01
引用: damiaa 发表于 2022-11-25 11:01 两个事情:字节对齐和大小端   字节对齐的问题:字节按照一定规则在空间上排列就是字节对齐。字 ...

我还以为所有的单片机都是从右向左(大端)数呢

点赞  2022-11-25 17:36

人工凑,能凑齐就放一起。

默认摸鱼,再摸鱼。2022、9、28
点赞  2022-11-28 09:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复