结构体在C语言中的内存布局是怎样的



在C语言中,结构体的内存布局遵循一定的规则,这些规则主要涉及内存对齐和填充字节的插入。以下是根据我搜索到的资料总结的结构体内存布局规则:

1. 成员按顺序存储:结构体的成员按照它们在结构体中定义的顺序依次存储在内存中。

2. 内存对齐

数据成员对齐:第一个数据成员的地址为结构体起始地址偏移量为0的位置,即第一个成员始终位于结构体开始处。

其他数据成员对齐:每个数据成员的起始地址必须是其自身大小或编译器默认对齐模数的整数倍。例如,在32位系统中,编译器默认对齐模数为4字节,如果一个结构体包含一个1字节的`char`类型成员和一个4字节的`int`类型成员,编译器会在`char`类型成员后填充3字节,使`int`类型成员的起始地址成为4字节的倍数。

结构体整体对齐:结构体的总大小必须是结构体中最大数据成员大小或编译器默认对齐模数(取较大者)的整数倍。

3. 填充字节:为了满足对齐要求,编译器可能会在结构体成员之间或结构体末尾插入填充字节。

结构体在C语言中的内存布局是怎样的

4. 手动设置对齐模数:可以使用`pragma pack(n)`指令来指定对齐模数,但这可能会影响内存访问效率。

示例分析

示例1:结构体`Inner`和`Outer`

```c

struct Inner {

char a; // 1字节

int b; // 4字节

};

struct Outer {

struct Inner inner_member; // 嵌套结构体

double c; // 8字节

};

```

Inner结构体

`char a` 占 1 字节。

为了满足 `int b` 的 4 字节对齐要求,插入 3 字节填充。

`int b` 占 4 字节。

总大小为 8 字节(4 的倍数)。

Outer结构体

`inner_member` 占 8 字节。

`double c` 占 8 字节,按 8 字节对齐。

总大小为 16 字节(8 的倍数)。

示例2:结构体`MtlFragmentUniforms`

假设结构体`MtlFragmentUniforms`包含以下成员:

```c

struct MtlFragmentUniforms {

float a; // 4字节

int b; // 4字节

char c; // 1字节

double d; // 8字节

};

```

内存布局

`float a` 占 4 字节。

`int b` 占 4 字节。

`char c` 占 1 字节,为了满足 `double d` 的 8 字节对齐要求,插入 3 字节填充。

`double d` 占 8 字节。

总大小为 20 字节,但为了满足结构体整体对齐要求(最大成员为 `double`,8 字节),总大小调整为 24 字节。

结构体在C语言中的内存布局主要受内存对齐规则的影响,编译器会根据这些规则插入填充字节以确保每个成员的起始地址满足其自身大小或编译器默认对齐模数的整数倍。理解这些规则有助于优化结构体的内存使用和提高程序性能。

| 结构体成员 | 类型 | 大小 (字节) | 对齐要求 | 填充字节 | 总大小 (字节) |

|------------|------|-------------|----------|----------|----------------|

| Inner | char | 1 | 4 | 3 | 8 |

| Inner | int | 4 | 4 | 0 | 8 |

| Outer | Inner | 8 | 8 | 0 | 16 |

| Outer | double | 8 | 8 | 0 | 16 |

| MtlFragmentUniforms | float | 4 | 4 | 0 | 4 |

| MtlFragmentUniforms | int | 4 | 4 | 0 | 8 |

| MtlFragmentUniforms | char | 1 | 1 | 3 | 12 |

| MtlFragmentUniforms | double | 8 | 8 | 0 | 20 (调整为24) |




上一篇:绑定银行卡时需要提供哪些信息
下一篇:结核病患者出现肺结节时,应如何进一步检查
黔驴技穷中的驴虎之争 驴虎之争的故事
消费者权益保护中的知情权是什么意思
狗在儿童教育中的象征意义是什么
一个连最少有多少人、一个连是多少人数
不同文化中的英雄时刻有何异同
如何清除WPS文档中的多余格式
如何写作中的情感表达
手机WiFi网络设置中的DNS是什么意思
定位服务在iOS设备中的工作原理
圣巫在长时间战斗中的输出维持策略
QQ游戏人生中的装备系统是怎样的
如何避免短信和邮件中的病毒链接
地下室防水施工中的安全注意事项
These在听力中的语法结构有哪些常见形式
如何判断澳门购物中的假货清仓是否可信
如何解决人脸识别中的年龄、性别偏差
如何检查和清理启动项中的恶意软件