C语言结构体内存对齐的复杂机制是如何影响其布局与性能的?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2164个文字,预计阅读时间需要9分钟。
前言+在前面的章节中,我们提到了C语言中整数的存储及浮点数。今天,我们来聊一聊关于结构体内存的知识。+我们先来看一个例子:+struct S1{+char c1;+int i;+char c2;+};+大家来猜猜这个结构体的大小是多少?+
前言
在前面的章节中,我们谈到了C语言中整数以及浮点数的储存
今天,我们来谈一谈一些关于结构体内存的知识。
我们先来看一个例子:
struct S1 { char c1; int i; char c2; };
大家来猜猜这个结构体S1的内存是多少?
相信会有人给出 6 的结果,他们或许是这样想的,两个 char 类型分别为一个字节,一个 int 类型又为4个字节,加起来刚好为6个
但是
结果真是如此吗?
我们来看看运行结果:
为什么呢,接下来我们就引出正文。
一.结构体内存对齐规则
首先,正如引例所示,结构体的内存并不是简简单单的将结构体各个成员的大小相加。
结构体的大小往往遵循着结构体的对齐规则:
- 第一个成员在与结构体变量偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
- 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
本文共计2164个文字,预计阅读时间需要9分钟。
前言+在前面的章节中,我们提到了C语言中整数的存储及浮点数。今天,我们来聊一聊关于结构体内存的知识。+我们先来看一个例子:+struct S1{+char c1;+int i;+char c2;+};+大家来猜猜这个结构体的大小是多少?+
前言
在前面的章节中,我们谈到了C语言中整数以及浮点数的储存
今天,我们来谈一谈一些关于结构体内存的知识。
我们先来看一个例子:
struct S1 { char c1; int i; char c2; };
大家来猜猜这个结构体S1的内存是多少?
相信会有人给出 6 的结果,他们或许是这样想的,两个 char 类型分别为一个字节,一个 int 类型又为4个字节,加起来刚好为6个
但是
结果真是如此吗?
我们来看看运行结果:
为什么呢,接下来我们就引出正文。
一.结构体内存对齐规则
首先,正如引例所示,结构体的内存并不是简简单单的将结构体各个成员的大小相加。
结构体的大小往往遵循着结构体的对齐规则:
- 第一个成员在与结构体变量偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
- 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

