什么网站可以做2.5D场景,做的网站怎么上传图片,丽水市城乡建设局网站,在线免费crm黑白配原文链接#xff1a;sizeof()计算结构体的大小_海月汐辰-CSDN博客_结构体的sizeof怎么计算
简要说明#xff1a;结构体成员按照定义时的顺序依次存储在连续的内存空间#xff0c;但是结构体的大小并不是简单的把所有成员大小相加#xff0c;而是遵循一定的规则#xff0c…原文链接sizeof()计算结构体的大小_海月汐辰-CSDN博客_结构体的sizeof怎么计算
简要说明结构体成员按照定义时的顺序依次存储在连续的内存空间但是结构体的大小并不是简单的把所有成员大小相加而是遵循一定的规则需要考虑到系统在存储结构体变量时的地址对齐问题。
一、没有成员的结构体占用的空间是多少个字节 答案是1个字节。 这就是实例化的原因空类同样可以被实例化每个实例在内存中都有一个独一无二的地址为了达到这个目的编译器往往会给一个空类或空结构体C中结构体也可看为类隐含的加一个字节这样空类或空结构体在实例化后在内存得到了独一无二的地址所以空类所占的内存大小是1个字节。
二、首先介绍一个相关的概念——偏移量 struct stru { int a; //start address is 0 char b; //start address is 4 int c; //start address is 8 }; 偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然结构体变量中第一个成员的地址就是结构体变量的首地址。比如上面的结构体第一个成员a的偏移量为0。第二个成员b的偏移量是第一个成员的偏移量加上第一个成员的大小04,其值为4第三个成员c的偏移量是第二个成员的偏移量应该是加上第二个成员的大小41。 三、在实际中存储变量时地址要求对齐编译器在编译程序时会遵循两条原则 1结构体变量中成员的偏移量必须是成员大小的整数倍0被认为是任何数的整数倍 2结构体大小必须是所有成员大小的整数倍也即所有成员大小的公倍数。
例子1 struct stru1 { int a; //start address is 0 char b; //start address is 4 int c; //start address is 8 };
PS:用sizeof求该结构体的大小发现值为12。int占4个字节char占1个字节结果应该是9个字节才对啊为什么呢这个例子中前两个成员的偏移量都满足要求但第三个成员的偏移量为5并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节使得第三个成员的偏移量变成8。结构体大小等于最后一个成员的偏移量加上其大小上面的例子中计算出来的大小为12满足要求。
例子2
struct stru2 { int i; //start address is 0 short m; //start address is 4 };
PS成员i的偏移量为0成员m的偏移量为4都不需要调整。但计算出来的大小为6显然不是成员m大小的整数倍。因此编译器会在成员m后面补上2个字节使得结构体的大小变成8从而满足第二个要求。
例子3、4 struct stru3 { char i; //start address is 0 int m; //start address is 4 char n; //start address is 8 }; struct stru4 { char i; //start address is 0 char n; //start address is 1 int m; //start address is 4 };
虽然结构体stru3和stru4中成员都一样但sizeof(struct stru3)的值为12而sizeof(struct stru4)的值为8。
由此可见结构体类型需要考虑到字节对齐的情况不同的顺序会影响结构体的大小。
四、 对于嵌套的结构体需要将其展开。对结构体求sizeof时上述两种原则变为 1展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。 2结构体大小必须是所有成员大小的整数倍这里所有成员计算的是展开后的成员而不是将嵌套的结构体当做一个整体。
例子1
struct stru5 { short i; struct { char c; int j; } tt; int k; };
结构体stru5的成员tt.c的偏移量应该是4而不是2。整个结构体大小应该是16。
例子2
struct stru6 { char i; struct { char c; int j; } tt; char a; char b; char d; char e; int f; };
结构体tt单独计算占用空间为8而stru6的sizeof则是20不是8的整数倍这说明在计算sizeof(stru6)时将嵌套的结构体ss展开了这样stu6中最大的成员为tt.j占用4个字节20为4的整数倍。如果将tt当做一个整体结果应该是24了。
五另一个特殊的例子是结构体中包含数组其sizeof应当和处理嵌套结构体一样将其展开如下例子
struct array { float f; char p; int arr[3]; };
其值为20。float占4个字节到char p时偏移量为4p占一个字节到int arr[3]时偏移量为5扩展为int的整数倍而非int arr[3]的整数倍这样偏移量变为8而不是12。结果是81220是最大成员float或int的大小的整数倍。
测试环境vc6.0
测试代码
//#ifndef __cplusplus//#endif#include iostream
#include stdio.h
#include stdlib.h
using namespace std;struct stru_empty
{};
struct stru1
{ int a; //start address is 0char b; //start address is 4int c; //start address is 8
};
struct stru2
{ int i; //start address is 0short m; //start address is 4
};
struct stru3
{ char i; //start address is 0 int m; //start address is 4char n; //start address is 8
};
struct stru4
{ char i; //start address is 0char n; //start address is 1int m; //start address is 4};struct stru5
{ short i; struct { char c; int j; } ss; int k;
};
struct stru6
{ char i; struct { char c; int j; } tt; char a; char b; char d; char e; int f;
};
struct stru7
{ char i; struct { char c; //int j; } tt; char a; char b; char d; char e; int f;
};
struct array
{ float f; char p; int arr[3];
};
int main()
{ struct stru6 st6;struct stru7 st7;struct array ar;printf(sizof(char)%d \n,sizeof(char));printf(sizof(int)%d \n,sizeof(int));printf(sizof(short int)%d \n,sizeof(short int));printf(sizof(long int)%d \n,sizeof(long int));printf(sizof(long)%d \n,sizeof(long));printf(sizof(float)%d \n\n,sizeof(float));printf(sizof(stru_empty)%d \n,sizeof(stru_empty));printf(sizof(stru1)%d \n\n,sizeof(stru1));printf(sizof(stru2)%d \n\n,sizeof(stru2));printf(sizof(stru3)%d \n\n,sizeof(stru3));printf(sizof(stru4)%d \n\n,sizeof(stru4));printf(sizof(stru5)%d \n\n,sizeof(stru5));printf(sizof(stru6)%d \n,sizeof(stru6)); printf(sizof(stru6.tt)%d \n,sizeof(st6.tt));printf(the address of stru6.i%d \n,st6.i);printf(the address of stru6.a%d \n\n,st6.a);printf(sizof(stru7)%d \n,sizeof(stru7));printf(sizof(stru7)%d \n,sizeof(st7.tt));printf(the address of stru7.i%d \n,st7.i);printf(the address of stru7.a%d \n\n,st7.a);printf(sizof(ar)%d \n,sizeof(ar));printf(sizof(ar.f)%d \n,sizeof(ar.f));printf(sizof(ar.arr)%d \n,sizeof(ar.arr));return 0;
}
运行结果