目录
C语言的字节对齐
结构体和联合体的大小
在C编译器缺省情况下的字节对齐方式
默认int类型成员的对齐长度为4字节,char为1字节,float为4字节,double类型为8字节对齐
结构体的总大小为结构体最宽字节基本类型成员大小的整数倍,如果有需要,编译器会在最末一个成员之后加上一些填充字节
原则上,共用体的大小取决于占据最多内存的成员的长度。共用体的长度一定可以被最小数据类型整除,也必须至少包含最大成员数据
/*
* C/C++ 语言
*
* @author Erice_s
* @date 2017/10/20
*
*/
#include <iostream>
using namespace std;
union
{
char name[62]; // 62
int age; //4
double num; //8
} a,b,c;
//匿名联合体,只能用a b c 来引用
union m
{
double b; //8
char str[9]; //9
};
int main(void)
{
int size = sizeof(a);//64 成员最大为62 但是要整除 1 4 8 ==》 64
printf("sizeof(a)=%d\n",size);
size = sizeof(m); //16 成员最大为9 但是要整除 8 ==》 16
printf("sizeof(a)=%d\n", size);
return 0;
}
运行结果
/*
* C/C++ 语言
*
* @author Erice_s
* @date 2017/10/20
*
*/
#include <iostream>
using namespace std;
struct
{
char name[62]; // 62
int age; //4
double num; //8
} a,b,c;
struct m
{
double b; //8
char str[9]; //9
};
int main(void)
{
printf("sizeof(a)=%d\n", sizeof(a)); //74 要求能够整除最宽基本类型的成员 double 8 ==》 80
printf("sizeof(m)=%d\n", sizeof(m)); // 8+9=17 同时要能整除8 即最后长度 ==》 24
return 0;
}
运行结果
#pragma pack
#pragma pack(n)用来指定C编译器编译选项为n字节对齐
#pragma pack()取消自定义字节对齐方式
关于对齐,每个数据成员自身都大小x;并且指定对齐宽带为y,那么该数据的实际对齐大小N=min(x,y),该数据成员的起始地址必须是N的倍数,总长度必须是指定对齐宽度y的倍数。
#pragma pack(2)
struct s
{
char c; //char为1个字节 N=min(x,y)=min(1,2)=1 内存空间0-0;
int i; //int 为4个字节 N=min(x,y)=min(4,2)=2 本应该为1-4 但是要求“数据成员的起始地址必须是N的倍数” 所以内存空间2-5
};
//占用字节10 1111 ==》6个字节
#pragma pack();
此时sizeof(s)=6
#pragma pack(8)
struct B
{
short c; //short为2个字节 内存空间0-1;
int i; //int 为4个字节 本应该为2-5 N=min(x,y=min(4,8)=4 但是要求“数据成员的起始地址必须是N的倍数” 所以内存空间4-7 //2-3空间补0
};
//占用字节1100 1111 ==》8个字节
#pragma pack();
此时sizeof(B)=8