当前位置: 首页 > wzjs >正文

官方网站下载cad网站怎么做短信营销

官方网站下载cad,网站怎么做短信营销,网站建设推广报价单,帮别人做网站收多少钱合适在 C 语言中,构造体(struct)和共同体(union)允许我们将多种数据类型组合到一起。除了常见的基本数据类型之外,经常还会在它们中嵌入数组和指针。由于数组的内存是连续分配的,而指针的大小与平台…

        在 C 语言中,构造体(struct)和共同体(union)允许我们将多种数据类型组合到一起。除了常见的基本数据类型之外,经常还会在它们中嵌入数组和指针。由于数组的内存是连续分配的,而指针的大小与平台相关(32 位一般为 4 字节,64 位一般为 8 字节),计算内存大小时就需要特别注意内存对齐填充的影响。本文将通过具体示例说明如何计算包含数组和指针的构造体和共同体的内存大小。

 一、构造体(Struct)中包含数组和指针

1.1基本原理

  • 数组:数组内存占用空间为“数组元素个数×单个元素大小”,且所有元素是连续排列。
  • 指针:指针只存储一个地址,其大小固定(取决编译平台,与指向数据无关)。
  • 内存对齐与填充:编译器为了提高内存访问效率,会按照每个成员的对齐要求进行排列。如果某个成员的起始地址不满足对齐要求,编译器会在前面插入填充字节。同时整个结构体的大小也会被调整为结构体中最大对齐要求的整倍数。

1.2示例: 构造体包含数组和指针

        假设在 64 位系统下(指针大小为 8 字节,int 为 4 字节,char 为 1 字节),如下构造体的定义为例:

struct Example {char a;        // 1 字节int b;         // 4 字节,要求 4 字节对齐char arr[3];   // 数组,占 3 字节int *ptr;      // 指针,占 8 字节(64 位系统)
};

内存布局分析

1.成员 a(char):

  • 从偏移 0 开始,占 1 字节。

2.成员 b(int):

  • 由于 int 要求 4 字节对齐,而 a 只占 1 字节,所以在 a 后面需要 3 字节填充,使得 b 的起始地址为偏移 4。
  • b 占 4 字节,从偏移 4 到 7。

3.成员 arr[3](数组):

  • 紧接在 b 后面,从偏移 8 开始。
  • 数组大小为 3 字节,覆盖偏移 8、9、10。

4.成员 ptr(指针):

  • 指针要求 8 字节对齐,而当前下一个可用偏移为 11,不满足 8 字节对齐(因为 11 不是 8 的倍数)。
  • 编译器需要在 arr 后插入 5 字节填充,使得 ptr 从偏移 16 开始。
  • ptr 占 8 字节,从偏移 16 到 23。

5.整体大小调整:

  • 当前各部分占用总字节数为 24 字节(0~23),而最大对齐要求为 8 字节,24 已经是 8 的倍数,因此最终结构体大小为 24 字节

1.3 嵌套构造体中包含数组和指针

   考虑一个构造体嵌套了另一个包含数组和指针的构造体:

struct Inner {char d;      // 1 字节int arr[2];  // 数组:2 个 int,每个 4 字节,总 8 字节,要求 4 字节对齐
};struct Outer {int a;           // 4 字节struct Inner in; // 内部构造体char *p;         // 指针,8 字节(64 位系统)
};

内部构造体 Inner 的内存计算

1.成员 d(char):

  • 从偏移 0 开始,占 1 字节。

2.成员 arr[2](数组):

  • int 要求 4 字节对齐,因此 d 后需要 3 字节填充,使得 arr 从偏移 4 开始。
  • arr 占 2×4 = 8 字节,从偏移 4 到 11。

3.内部结构体总大小:

  • 总大小为 12 字节,但整体大小需要调整到最大对齐要求(这里为 4 字节)的整数倍。12 已经是 4 的倍数,因此 Inner 的大小为 12 字节

外部构造体 Outer 的内存计算

1.成员 a(int):

  • 从偏移 0 开始,占 4 字节。

2.成员 in(结构体 Inner):

  • 直接放在 a 后面。当前偏移为 4,Inner 要求的对齐是 4 字节,偏移 4 满足要求。
  • in 占 12 字节,从偏移 4 到 15。

3.成员 p(指针):

  • 当前下一个偏移为 16,但指针要求 8 字节对齐。
  • 偏移 16 已经是 8 的倍数,因此无需额外填充。
  • p 占 8 字节,从偏移 16 到 23。

4.外部结构体总大小:

  • 累计占用 24 字节,总大小为 24 字节(已满足 8 字节对齐的要求)。

二、共同体(union)中包含数组和指针 

2.1 基本原理

        在共同体中,所有成员共享同一块内存,其大小由最大成员的大小决定,同时也需要满足该成员的对齐要求。即使共同体中包含数组和指针,原则也是一致的。

2.2 示例:共同体中包含数组和指针

union Union {int arr[4];    // 数组:4 个 int,每个 4 字节,总共 16 字节double *dptr;  // 指针,8 字节(64 位系统)char c[10];    // 数组:10 个 char,总 10 字节
};
内存大小计算
  • arr[4] 占 4 × 4 = 16 字节
  • dptr 占 8 字节
  • c[10] 占 10 字节

取最大值: 最大成员为 arr[4],大小为 16 字节。
同时需要考虑最大对齐要求,假设 int 要求 4 字节,而指针要求 8 字节;由于最大成员(数组)的元素对齐为 4 字节,但联合体的整体对齐要求通常取决于所有成员中最大的(这里可能由指针决定为 8 字节),不过最终分配空间依旧是 16 字节(且该空间会按 8 字节对齐)。因此,该共同体的总大小为 16 字节

三、总结与注意事项

1.构造体(struct):

  • 内存分布为成员按照声明顺序排列。
  • 数组成员按照数组中所有元素总大小分配。
  • 指针成员只占指针本身大小,不考虑所指数据。
  • 必须考虑每个成员的对齐要求,必要时插入填充字节,整体大小也需调整为最大对齐要求的整数倍。
  • 嵌套构造体时,先计算内部结构体的大小,再按照外部成员的排列顺序计算整体大小。

2.共同体(union):

  • 所有成员共享同一块内存,大小取决于最大的成员(同时满足对齐要求)。
  • 数组和指针的计算方法依然适用,但只取最大值即可。
http://www.dtcms.com/wzjs/550912.html

相关文章:

  • 湖北省住房和城乡建设网站怎么夸一个网站做的好看
  • 网站推广找客户深圳市建设网站公司
  • php开源免费网站模板做网站一般多钱
  • wordpress怎样搭建网站烟台网站改版
  • 潍坊网站定制模板建站哪些网站用php
  • 网站进行中英文转换怎么做广东建设网站公司
  • 门户网站制作定制360优化大师app下载
  • 临沂建设局网站官网手机编辑个人简历
  • 泰兴市城乡住房建设局网站wordpress手机悬浮
  • 模板之家网站个人网站该怎么打广告
  • 阅读分享网站模板wordpress主题 使用
  • 企业手机网站建设效果网站如何做搜索功能的
  • wordpress站演示做女装网站应怎么定位
  • 搭建网站的软件有哪些做百度联盟用什么做网站
  • 摄影网站的意义学校网站建设价格
  • 济南企业建站品牌wordpress挂广告能赚多少
  • 建立网站需要投入的成本wordpress论坛社区主题
  • vue做的网站有什么网站自己做流量
  • 网站不备案备案网站模板预览与编辑器
  • 研发网站要多久杭州利兴建设官方网站
  • 上海专业网站建设报价wordpress打印插件
  • 网站自动优化怎么样分类网站怎么做seo
  • 各种网站开发工具穆棱市城乡建设局网站
  • 企业网站配色网站建设中建站广告html单页面
  • 网页设计网站模板网站建设网页模板下载深圳产品设计公司排名前十强
  • 怎么管理网站添加代码wordpress 模板汉化
  • 网站基础优化域名到期了网站备案还有效吗
  • 丹东网站开发公司工地模板是什么材料做的
  • 哪儿能做邯郸网站建设做网站起什么题目
  • 网站建设方案 规划wordpress红色