C语言中的构造数据类型有三种:数组、结构体和共用体。
数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数。
结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。
程序实例解析如下:
#include <iostream>
using namespace std;
struct A
{ //上一个的偏移量+自身大小=自己的偏移量(补齐后)
char _iC1;//0=0
long _il;//0+1=1+3
char _iC2;//4+4=8 //结构体大小等于最后一个成员的偏移量加上其大小
double _id;//8+1=>9+7=16 =>16+8=24//所有成员大小的整数倍
};
//打乱顺序
struct B {
char _iC1;//0=0
char _iC2;//0+1=1
long _il;//1+1=>2+2=4
double _id;//4+4=8 =>8+8=16
};
//编译器在编译程序时会遵循两条原则:
//一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
//二、结构体大小必须是所有成员大小的整数倍。
int main(){
cout<<sizeof(char)<<endl;//1
cout<<sizeof(short)<<endl;//2
cout<<sizeof(int)<<endl;//4
cout<<sizeof(long)<<endl;//4
cout<<sizeof(double)<<endl;//8
cout << "sizeof(A)=" <<sizeof(A) << endl;//24
cout << "sizeof(B)=" <<sizeof(B) << endl;//16
}