sizeof详细查找结构的大小

电脑杂谈  发布时间:2020-05-09 11:30:30  来源:网络整理

卵细胞的结构大小形状还有其他_计算结构体大小_结构数组 大小

运算符sizeof可以计算给定类型的大小. 对于32位系统,sizeof(char)= 1; sizeof(int)=4. 基本数据类型的大小易于计算,让我们看一下如何计算构造数据类型的大小. 用C语言构造的数据有三种类型: 数组,结构和联合. 数组是相同类型的元素的集合. 只要计算单个元素的大小,整个数组所占用的空间就等于基本元素的大小乘以元素数. 结构中的成员可以具有不同的数据类型,并且成员以定义它们的顺序存储在连续的存储空间中. 与数组不同,结构的大小不仅仅是所有成员大小的总和. 系统存储结构变量时,需要考虑地址对齐问题. 看一下这样的结构: [cpp]查看普通copy1. 2. 3. 4. 5. 6. struct stu1 {int i;字符c; int j;};使用sizeof查找结构的大小并查找值对于12. Int占用4个字节,char占用1个字节,结果应该是9个字节,为什么?首先介绍一个相关的概念偏移. 偏移量是指结构变量中成员的地址与结构变量地址之间的差. 结构的大小等于最后一个成员的偏移量加上最后一个成员的大小.

结构数组 大小_卵细胞的结构大小形状还有其他_计算结构体大小

显然,结构变量的第一个成员的地址是结构变量的第一个地址. 因此计算结构体大小,第一成员i的偏移量为0. 第二成员c的偏移量为第一成员的偏移量加上第一成员的大小(0 + 4),其值为4;第三个成员的偏移量j是第二个成员的偏移量加上第二个成员的大小(4 + 1),该值为5. 但是,实际上,在存储变量时需要对齐. 编译程序时,编译器将遵循两个原则: (1)成员在结构变量中的偏移量必须是成员大小的整数倍(0被认为是成员数的整数倍)(2)该结构必须是所有成员大小的整数倍,即所有成员大小的公倍数在上面的示例中,前两个成员的偏移量满足要求,但第三个成员的偏移量满足要求为5,这不是其自身大小的整数倍(int). 编译器在处理时将在第二个成员之后添加3个空字节,以便第三个成员的偏移量变为8. 到最后一个成员的偏移量加上它的大小. 上例中计算得出的大小为12,它满足要求. 让我们看另一个示例: [cpp]查看普通copy1. 2. 3. 4. 5.struct stu2 { int k; short t;};成员k的偏移量为0;成员t的偏移量为4计算结构体大小,无调整是必需的.

卵细胞的结构大小形状还有其他_结构数组 大小_计算结构体大小

但是计算得出的大小为6,这显然不是成员k大小的整数倍. 因此,编译器将在成员t之后添加2个字节,以便结构的大小变为8以满足第二个要求. 可以看出,结构类型需要考虑字节对齐,不同的顺序会影响结构的大小. 比较以下两个定义序列: [cpp]视图纯副本1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. struct stu3 {char c1;我char c2;} struct stu4 {char c1;字符c2; int i;}尽管stu3和stu4的成员相同,但是sizeof(结构stu3)的值是12,sizeof(结构stu4)的值是8. 对于嵌套结构,您需要对其进行扩展. 当确定一个结构的大小时,以上两个原则变为: (1)扩展结构的第一个成员的偏移量应为扩展结构的最大成员的整数倍. (2)结构的大小必须是所有成员大小的整数倍. 在这里,所有成员都被计算为扩展成员,而不是整体. 请参见以下示例: [cpp]查看纯副本1. 2. 3. 4. 5. 6. 6. 7. 8. 9. 10. struct stu5 {short i; struct {char c; int j;} ss; int k; }结构stu5的成员ss.c的偏移量应为4,而不是2.

计算结构体大小_结构数组 大小_卵细胞的结构大小形状还有其他

整个结构的大小应为16. 以下代码测试原理2: [cpp]视图纯副本1. 2. 3. 4. 5. 6. 7. 8. 9. 9. 10. 11. 12. struct stu5 {char i; struct {char c; int j; } ss;字符字符b;字符d;字符13. 14. char f;仅结构ss计算出的占用空间为8,而stu5的sizeof为20,而不是8的整数倍,这表明在计算sizeof(stu5)时,嵌套结构ss被扩展了,因此stu5中的最大成员是ss.j,占位4个字节,而20是4的整数倍. 如果将ss视为一个整体,结果应为24. 另一个特殊的例子是结构包含数组,sizeof应该与嵌套结构,将其展开,如以下示例所示: [cpp]查看普通copy1. 2. 3. 4. 5. 6. 6. 7.struct ss {float f;字符p; int adf [3];}; cout << sizeof(ss)<< endl;它的值为20.

计算结构体大小_卵细胞的结构大小形状还有其他_结构数组 大小

浮点数占4个字节,当char p时,偏移量为4,p占1个字节,当int adf [3]时偏移量为5,扩展为int的整数倍,而不是int adf的整数倍[3] ,因此偏移量变为8而不是12. 结果是8 + 12 = 20,这是最大成员float或int大小的整数倍. 由编译器决定如何为结构变量分配空间. 以上情况是指Linux下的GCC. Windows下的VC平台也是如此,对于其他平台,可能会有不同的对待.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-204087-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 梁壮壮
        梁壮壮

        我们是“让它三分”

      热点图片
      拼命载入中...