今天在复习c++基础知识时,发现了一个c++结构体对齐问题,怎么算一个结构体所占的位数,我得出了一个技巧。
#include <iostream>
using namespace std;
typedef struct example1{
char a;
int b;
short c;
double d;
}example1;
typedef struct example2{
char a;
short b;
int c;
double d;
}example2;
int main()
{
example1 example1;
example2 example2;
cout<<sizeof(example1)<<" "<<sizeof(example2)<<endl;
return 1;
}
怎么求结构体example1和example2所占的位数,这里有一个规律,就是结构体所占的位数必然是结构体内占用位数最多的成员所占位数的倍数。
结构体example1和example2中占用位数最多的成员的是double类型,在32位机子上占8个字节。故结构体所占位数可能是8,16,24,32.等等。
怎么分析,下面先分析example1:
1 假设example1只有前面char 和int两个类型成员,char 占用1个字节,int占4个字节,int类型占用字节还是最多,不考虑对齐问题,example1占用1+4=5个字节,考虑对齐问题,example1占4的最小倍数4+4=8个字节
2 现在example1加上short c成员,int类型占用字节还是最多,不考虑对齐问题,example1占用8+1=9,考虑对齐问题,example1占4的最小倍数8+4=12个字节
3现在example1加上double d成员,double类型占用字节最多,不考虑对齐问题,example1占用12+8=20,考虑对齐问题,example1占8的最小倍数12+8+4=24个字节
同理分析example2
1 假设example2只有前面char 和short两个类型成员,char 占用1个字节,short占2个字节,short类型占用字节还是最多,不考虑对齐问题,example1占用1+2=3个字节,考虑对齐问题,example1占2的最小倍数2+2=4个字节
2 现在example1加上int c成员,int类型占用字节还是最多,不考虑对齐问题,example1占用4+4=8,考虑对齐问题,example1占4的最小倍数4+4=8个字节
3 现在example1加上double d成员,double类型占用字节最多,不考虑对齐问题,example1占用8+8=16,考虑对齐问题,example1占8的最小倍数8+8=16个字节
故程序运行的结果为24,16