美文网首页iOS细节知识收录
C语言结构体大小的计算方式

C语言结构体大小的计算方式

作者: studystudy | 来源:发表于2017-10-15 16:52 被阅读24次

定义

结构体中的偏移量

结构体中的偏移量是一个成员的实际地址和结构体首地址之间的距离。

结构体大小计算

结构体大小 会涉及到字节对齐(目的是 让计算机快速读写 以空间换取时间)。即,最后一个成员的偏移量加上最后一个成员的大小再加上末尾的填充字节数。

结构体内偏移规则

1、每个成员的偏移量都必须是当前成员所占内存大小的整数倍如果不是编译器会在成员之间加上填充字节。

2、当所有成员大小计算完毕后,编译器判断当前结构体大小是否是结构体中最宽的成员变量大小的整数倍 如果不是会在最后一个成员后做字节填充。

```

struct unknown {

inta; 

charb;

intc;

longd;

chare;

};

printf("%lu\n",sizeof(structunknown));//output : 32

```

结构体重共有一个long类型,两个char类型,两个int类型成员。如果只按照这几个成员大小相加,结构体大小应该是 8 + 2 * 4 + 2 * 1 = 18 个字节大小。但实际上该结构体是32个字节大小。

下面来一步步分析编译器是如何计算大小进行分配的。(以下未标明单位的数字以字节为单位)

1、遇到第一个成员变量a,该成员偏移量为0,大小为4,符合偏移规则第一条。

2、接下来第二个成员变量b,偏移量为4,大小为1,符合偏移规则第一条。

3、成员变量c,偏移量为5,大小为4,不符合偏移规则第一条。在成员b和c之间填充三个字节,此时,偏移量大小为8,符合偏移规则第一条,继续往下。

4、成员变量d,偏移量为12,大小为8,不符合偏移规则第一条,在成员c和d之间填充4个字节,此时偏移量为16,符合偏移规则第一条,继续往下。

5、成员变量e,偏移量为24,大小为1,符合偏移规则第一条。

6、所有成员大小计算完后,执行偏移规则第二条,最宽的类型是d,long类型,8个字节,当前结构体计算出的大小为25,并不符合第二条规则,于是在末尾填充7个字节,总大小为32个字节,满足第二条偏移规则。到此结构体大小计算结束。

相关文章

  • C语言结构体大小的计算方式

    定义 结构体中的偏移量 结构体中的偏移量是一个成员的实际地址和结构体首地址之间的距离。 结构体大小计算 结构体大小...

  • C语言结构体大小计算

    定义 结构体中的偏移量 结构体中的偏移量是一个成员的实际地址和结构体首地址之间的距离。 结构体大小计算 结构体大小...

  • C语言学习笔记-结构体占用内存大小的计算

    引言 结构体在C语言中虽然经常使用,但是怎么计算一个结构体占用多大的内存,很多C语言的新手都没注意过,其实C语言的...

  • OC让C语言面向对象的方式

    objc让C语言面向对象的方式 简介:objc使用结构体让C语言支持面向对象。本文主要对这些结构体的功能和实际运行...

  • C语言中结构体字节的计算方式

    在说计算方式之前先讲讲几个概念一个是偏移量还有一个是内存对齐。先说偏移量,百度百科对于它的定义是这样:把存储单元...

  • C语言和OC的结构体(struct)

    Struct(结构体) 1.结构体定义 2.结构体变量 3.结构体数组 4.C语言结构体指针 5.C语言共用体 6...

  • 嵌入式学习笔记19.11.26

    c语言结构体: //结构体能以一整组数据赋值给另一组 //结构体所占数据大小必定是4的倍数 //每行所占字节4个,...

  • C语言中的柔性数组

    C语言中 结构体末尾如果是定义的数组,那么这个数组只是一个标识符 并不占用结构体大小。 我们可以在结构体中定义一个...

  • C语言结构体用法很多,坑也很多

    C语言可谓是编程界的传奇语言,历经几 十 年,依然排名前列。 本文主要说的是C语言中的结构体,结构体是C语言中重要...

  • 12-Go语言结构体

    结构体 结构体的基本概念 什么是结构体Go语言中的结构体几乎和C语言中的结构体一模一样都需要先定义结构体类型, 再...

网友评论

    本文标题:C语言结构体大小的计算方式

    本文链接:https://www.haomeiwen.com/subject/baecuxtx.html