struct到底多大呢?
struct总是被当作一个书包,用一个比较不恰当的例子来说,就像是你要去旅游,但是用小包放不下你想带的东西,因此需要一个大包或者行李箱来装你想带的东西。这个行李箱就像是一个struct。
结构体经常被用于嵌入式系统、控制协议以及相互传输通信等等方面。比如,需要在客户端和服务端进行通信的时候,简单的用字符串指针去传输,使得传输容易出错误。因此可以将很多字节的数据进行封装,这样的话,效率也高,也不容易出错。但是,在使用结构体的时候,你们想过它有多大呢??
空结构体
struct Test_void_Struct
{
}T_V_S;
大家,想想这个空的结构体多大呢?
这里可以使用多个编译器去试一下。用过VC尝试之后,大小为1个字节,不是0;
在内存中,最小的存储单位是1个字节,因此这里编译器可能会为每个空结构体预留1个字节;
sizeof(T_V_S);
大家可以去多个编译器中试一下;
内存对齐
struct Test_Struct01
{
char a;
short b;
short c;
int d;
long long a1;
}T_S01;
大家想想,这个结构体T_S01多大呢?
sizeof(T_S01);
答案是:24
在编译器中,为了提高程序的性能,数据结构应该尽可能在边界上对齐。
char | short | ---- | short | ---- | ---- | ---- | ---- |
---|---|---|---|---|---|---|---|
int | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
long long | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
就像这个表格一样,每一行是8个字节(每一个小表格是一个字节),在32bit的计算机中,char为1个字节,short为2个字节,int为4个字节,long long为8个字节。
其中,在第一行中,short占有2个字节,这一行只剩下三个字节,因此int放不下了,这一行资源已经用完了;
第二行中,int占有4个字节,剩下4个字节,long long已经放不下去了,第二行的资源也就用完了;
因此,第三行的就被long long占满;
最后就是24个小空格,也就是24个字节;
预处理对齐
在编译器中,可以指定对齐多少个字节,上面的例子只是8个字节对齐;
#pragma pack(8)
这一行代码就是按多少的字节对齐;