32 lines
1.9 KiB
Markdown
32 lines
1.9 KiB
Markdown
|
---
|
|||
|
tags:
|
|||
|
- 字节对齐
|
|||
|
- 代码块
|
|||
|
- 结构体大小
|
|||
|
---
|
|||
|
# sizeof
|
|||
|
一般情况下,sizeof 的结果是在编译时确定的,这与结构体的成员类型和对齐规则密切相关。
|
|||
|
## 1. 结构体含有指针成员
|
|||
|
当结构体包含指针成员时,sizeof 返回的是指针本身的大小,而不是指针所指向的数据的大小。指针的大小取决于目标平台的架构,通常在 32 位系统上为 4 字节,在 64 位系统上为 8 字节。
|
|||
|
## 2. 结构体含有柔性数组成员(Flexible Array Member)
|
|||
|
柔性数组成员是一个特殊的数组,它只能作为结构体的最后一个成员,并且在结构体定义时,其大小是未知的,声明方式是 type array_name[];或 type array_name[0];。 使用sizeof获取柔性数组所在的结构体大小时,不会包含柔性数组的大小。 柔性数组的大小需要通过动态分配内存来确定。
|
|||
|
# 字节对齐
|
|||
|
在某些情况下,编译器可能会为了提高内存访问效率而进行内存对齐。如果发生了内存对齐,结构体的大小可能会比简单累加成员大小的结果要大。
|
|||
|
## 强制对齐
|
|||
|
使用`#pragma pack N`可强制对齐。若要获取结构体的真实大小,需要`#pragma pack 1`.
|
|||
|
对于不敏感的结构体,可采用默认对齐方式。
|
|||
|
若只想某个结构体强制对齐,使用如下方式包裹结构体:
|
|||
|
```c
|
|||
|
#pragma pack(push, 1) // 设置对齐为1字节
|
|||
|
typedef struct {
|
|||
|
uint8_t sensorStatus; // 下挂设备状态
|
|||
|
ValveStatus_t valves; // 两个三通阀状态
|
|||
|
PumpStatus_t pumps; // 两个泵状态
|
|||
|
uint8_t bubbleStatus; // 气泡状态
|
|||
|
float activityMeter; // 活度计uCi
|
|||
|
uint8_t estopStatus; // 急停状态
|
|||
|
uint8_t errorCode; // 错误码
|
|||
|
uint8_t initStatus; // 初始化状态
|
|||
|
} DeviceStatus_t;
|
|||
|
#pragma pack(pop) // 恢复默认对齐
|
|||
|
```
|