目录
1.求字节数
struct A
{
char t; //1;
char k; //1;
unsigned short i; //2;
unsigned long m;//4
};
int main()
{
cout << sizeof(unsigned short) << endl;//2
cout << sizeof(unsigned long) << endl; //4
cout << sizeof(A) << endl;//1+1+2+4=8
}
截图:
给大家整理出来:在64位系统里,unsigned short :2个字节
unsigned long:4个字节
ps:如果忘了哪个类型是多大,可以用sizeof哦。
当然结构体的大小并不仅仅是各个数据类型所占字节数相加。
2.计算结构体大小的方法
(1)内存对齐现象
①为什么要进行内存对其?
性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
空间原因:没有进行内存对齐的结构体或类会浪费一定的空间,当创建对象越多时,消耗的空间越多。
(//与顺序有关
//char c;//1>4
//int a;//4
//short b;//2>4 //12个字节
//char c;//1>2
//short b;//2
//int a;//4 //一共8个字节
int a;//4
char b[5];//1*5>8 12字节
struct asd1{
char a;
int b;
short c;
double d;
};//24个字节
struct asd2{
char a;
short b;
int c;
double d;
};//16个字节 2+2+4+8
(2)内存对齐规律
从上往下依次观察,如果第二个所占字节较大,第一个数据就要向第二个数据类型对齐,当出现第三个数据类型的时候,如果第三个所占字节比第二个小,就还是向第二个对齐(第一段代码),反之,如果第三个所占字节是第二个的倍数,则不用对齐(第二段代码)
特殊的是,double 对齐需要最后的结果是8的倍数,第四段代码:4 +4+4+8=20 需要补4才是8的倍数 所以24个字节