打印
[MM32软件]

结构体位段定义的变量在内存中顺序是什么样的?

[复制链接]
1029|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
643757107|  楼主 | 2024-9-28 12:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如定义一个结构体,先定义个int a ;再定义一个 int b;
那么这两个谁在高位谁在低位?你知道吗?


使用特权

评论回复
沙发
598330983| | 2024-9-28 12:16 | 只看该作者
这个要看设置的大小端问题了。

使用特权

评论回复
板凳
598330983| | 2024-9-28 12:16 | 只看该作者
结构体中使用位段(bit field)定义的变量在内存中的顺序和排列方式会受到以下几个因素的影响:

编译器的实现:不同的编译器对位段的处理方式可能会不同,例如是从最低有效位还是最高有效位开始排列。

系统的字节序(Endianness):

小端序(Little Endian):最低有效字节存储在最低地址。
大端序(Big Endian):最高有效字节存储在最低地址。
位段的长度:位段的长度(以bit为单位)定义了变量在内存中占据的位数。通常,位段会从一个字节的低位或者高位开始分配。

对齐要求:一些平台可能有对齐要求,即要求某些数据类型按照某种字节边界对齐。编译器可能会为了满足这些对齐要求在位段之间插入填充位。

使用特权

评论回复
地板
598330983| | 2024-9-28 12:17 | 只看该作者
假设你定义了一个结构体如下:
struct Example {
    unsigned int a : 3; // 3位
    unsigned int b : 5; // 5位
    unsigned int c : 8; // 8位
};
a 需要 3 位,b 需要 5 位,c 需要 8 位。
如果系统是小端序,变量通常从低地址向高地址填充,并且位段也按字节中的低位向高位依次排列。
假设 unsigned int 是 4 字节(32 位),这些变量会在 32 位的单元中依次排列,先填满一个单元后再用下一个。
假设在小端序系统中,a、b 和 c 的排列可能如下:
[code]|       32 bits (4 bytes)       |
| cccccccc | bbbbb | aaa | ......|

[/code]
但这些布局具体是怎样的会依赖于编译器的实现和平台特性。
在使用之前可以先测试一下,通过串口打印出来观察一下,然后再进行详细的操作。

使用特权

评论回复
5
eleg34ance| | 2024-10-23 17:50 | 只看该作者
结构体位段(Bit-fields)是一种在C语言中定义结构体成员的方式,允许你指定每个成员占用多少位。位段的内存布局依赖于具体的编译器实现,但通常遵循位段的定义

使用特权

评论回复
6
wamed| | 2024-10-23 17:54 | 只看该作者
编译器可能会插入填充位以满足对齐要求

使用特权

评论回复
7
twinkhahale| | 2024-10-23 18:54 | 只看该作者
位段成员的顺序:位段成员按照定义的顺序依次存储在内存中

使用特权

评论回复
8
星星点点didi| | 2024-10-23 20:05 | 只看该作者
如果一个位段成员不能完全放入当前字节中,它可能会被拆分到下一个字节

使用特权

评论回复
9
nqty| | 2024-10-23 21:10 | 只看该作者
编译器可能会在位段之间或位段之后插入填充位,以满足对齐要求

使用特权

评论回复
10
tiakon| | 2024-10-23 21:15 | 只看该作者
假设我们使用的是32位系统,且编译器按照从低位到高位的顺序存储位段:第一个字节:a 占用3位。b 占用5位,但由于a已经占用了3位,b的前2位会放在第一个字节的剩余2位中,剩下的3位放在第二个字节的前3位。第二个字节:b 的后3位。c 占用8位,放在第二个字节的剩余5位和第三个字节的3位。第三个字节:c 的后3位

使用特权

评论回复
11
ewyu| | 2024-10-23 22:20 | 只看该作者
一般来说位段成员按照定义的顺序存储

使用特权

评论回复
12
hhdhy| | 2024-10-24 07:56 | 只看该作者
其实位段可能会跨越字节边界。

使用特权

评论回复
13
teaccch| | 2024-10-24 10:14 | 只看该作者
具体的内存布局依赖于编译器的实现,因此在实际应用中,建议查阅编译器的文档以了解其具体行为

使用特权

评论回复
14
一切D都好| | 2024-10-24 12:54 | 只看该作者
这个可以利用字节长度的统计函数来统计结构体的长度啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

3780

帖子

11

粉丝