1、为什么要内存对齐
许多计算机系统对基本数据类型的合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是2,4,8,或16)的倍数。这种对齐限制简化了形成处理器和内存系统之间接口的硬件设计。(来源于计算机操作系统第一部分,程序结构和执行)
其中详细解释参考大神博客
https://blog.csdn.net/lgouc/article/details/8235471
2、内存对齐方法
1、利用默认规则
例1:
//代码1 共占用 2 * sizeof(int) 个字节
struct test
{
char a;
char b;
int num;
}
代码1 变量内存分布如图
默认情况下以 int 型变量 的字节数(K值)进行对齐。
因为char 类型只占用了一个字节,所以占1格,int 型需要4个字节,占了4格
所以整个test 结构体需要8个字节。
例2:
//代码2 共占用 3 * sizeof(int) 个字节
struct test
{
char a;
int num;
char b;
}
代码2 变量内存分布如图
总结:
在使用gcc编译时,由于结构体内变量按照先后顺序在内存中存储