程序案例1:结构体占内存的字节大小
#include <iostream>
using namespace std;
struct student{
char a;
int no;
double score;
};
int main(){
student s;
cout << sizeof(s.a) << endl; //1
cout << sizeof(s.no) << endl; //4
cout << sizeof(s.score) << endl;//8
cout << sizeof(s) << endl; //16
return 0;
}
结构体中元素按照定义顺序依次置于内存中,但并不是紧密排列。
规则一:
从结构体首地址开始依次将成员放入内存时,成员会被放置在其自身对齐大小的整数倍地址
上。
在 a 后面补齐3个字节,对齐int类型。所以结果是:16。
案例2:下面这段程序呢?
struct student{
char a;
double score;
int no;
};
我们发现此时结构体的大小并不是20而是24,那么多出来的这4个字节如何解释?我们引出第二条规则。
规则二:
如果结构体大小不是所有成员中最大对齐大小的整数倍,则结构体对齐到最大成员对齐大小的整数倍
,填充空间放置到结构体末尾。
案例3:
struct student{
double score;
char a;
int no;
char c;
};
是多少?这个结果就是 24。
数组
struct student{
double score;
char a[5];
int no;
};
参考规则二,在尾部补齐8的整数倍,结果是24
struct student{
char a; //1+3
int no[3]; //12
double score; //8
};
参考规则一,a后面补齐,结果是24
如果no[4],还要参考规则一,结果是32
指针
struct student{
char a; //1+3
int no; //4
int *score; //8(64位系统)
};
指针类型是地址,根据系统确定,如果是64位,就占8个字节,如果是32位就占4个字节。
参考规则一,结果是 16。