解析内存对齐 Data alignment: Straighten up and fly right的详解
内存对齐规则:
1、结构体的大小是结构体中所有数据类型所占内存字节数的最大值的整数倍
2、结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说 double 型成员相对于结构体的首地址的地址偏移量的应该是 8 的倍数;
3、为了满足规则 1 和 2 编译器会在结构体成员之后进行字节填充!
具体案例可参见 点击打开链接
#include <stdio.h>
struct A
{
char i;
char c;
int j;
char a[13];
} a;
int main()
{
printf("%d\n",sizeof(a));
return 0;
}
输出 24。
解析:这里 struct 中第一个 和第二个为 char 类型,只占 1 个字节,由于默认是以 4 字节对齐,故这两个 char 会占用第一个 4字节,剩余两个字节,由于第 3 个 为 int 类型,
剩余的 2 个字节不够存储,则会自己再开辟一个 4 字节空间供自己存储, 第 4 个 数据类型为 char 数组,但本质上还是 char 类型,故会占用 13 个字节,由于类存对齐,必为 4
的整数倍,多以会占用 16 个字节。
见如下代码:
#pragma pack(8)
#include <stdio.h>
struct A
{
int i;
char c;
int j;
char a[13];
} a;
int main()
{
printf("%d\n",sizeof(a));
return 0;
}
~
此时在程序开头加了条语句,此语句为修改 内存对齐字节数,将默认的 4 字节改为 8 字节,同上面的分析,可得
C++ 类的内存对齐,见如下代码:
class CTest
{
public:
CTest():m_chData(‘\0’),m_nData(0)
{
}
virtual void mem_fun(){}
private:
char m_chData;
int m_nData;
static char s_chData;
};
char CTest::s_chData=’\0’;
问 1)当以 4 字节对齐时, sizeof(CTest)的值是多少?
2)当以 1 字节对齐时,sizeof(CTest)的值是多少?
这里注意类的内存对齐与struct 的内存对齐会有些不同,类的内存对齐会考虑虚函数表指针哦。
具体可以参见:
上精华图:一张图说明类中成员变量,成员函数,静态变量与函数的空间位置。