结构体的对齐规则网上都有,这里就指通过具体代码与代码注释来解释未指定时结构体对齐大小时默认的对齐方式。
可以自行编译修改代码验证,加深对结构体对齐方式的理解
#include <stdio.h>
struct dst
{
char a; //起始位0,char占用1
int c; //int占用4byte,char占用1位需4对齐,所以起始位1对齐补3位=4,占用4byte
double b; //起始位8,double占用8byte
}; //所以总计16byte
struct pdst
{
int b; //起始位0,int占用4字节
double a; //double占用8位,int占用4位需8对齐,所以起始位4对齐补4位=8,占用8
char c; //起始位16,占用1位
}; //结构体与最大成员字节对齐,17%8!=0未对齐,所以对齐17+(8-(17%8))=24
//目的是为了验证后面的小字节成员位置
struct pdste
{
int a; //起始位0,int占用4字节
double b; //double占用8位,int占用4位需8对齐,所以起始位4对齐补4位=8,占用8
char c; //起始位16,占用1位
char d; //起始位17,占用1位
char e; //其实位18,占用1位
short f; //起始位19,short占用2位,所以起始位19+(2-(19%2))=20,占用4
}; //结构体与最大成员字节对齐,24%8=0已经对齐,所以=24
struct bst
{
int a:6; //起始位0,实际支配6bit
char b:1; //基本类型变化,所以起始位应为4,实际支配1bit
char c:5; //基本类型无变化,起始位位4+1/8,实际占用5bit=38/8
short d:4; //基本类型变化,起始位5,实际占用4bit
char e; //基本类型变化,起始位8,实际占用1
}; //成员总共占用9,最大成员int占用4byte,对齐所以占用12byte
int main()
{
printf("sizeof(double) =%d\t%d\n",sizeof(double),sizeof(struct dst));
printf("sizeof(int) =%d\t%d\n",sizeof(int),sizeof(struct pdst));
printf("sizeof(short) =%d\t%d\n",sizeof(short),sizeof(struct pdste));
printf("sizeof(char) =%d\t%d\n",sizeof(char),sizeof(struct bst));
return 0;
}