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

便捷的大连网站建设现代网站开发建设流程

便捷的大连网站建设,现代网站开发建设流程,建设网站后期人员薪酬,最潮流的网站开发脚本语言文章目录 一、乱臣贼子---结构体1.1结构体类型的声明1.1.1特殊的声明 1.2结构体的自引用1.3结构体变量的定义和初始化1.4结构体大小计算#xff08;内存对齐知识#xff09;1.4.1修改默认对齐数 1.5结构体传参1.6结构体实现位段1.6.1什么是位段1.6.2位段的内存分配1.6.3位段的… 文章目录 一、乱臣贼子---结构体1.1结构体类型的声明1.1.1特殊的声明 1.2结构体的自引用1.3结构体变量的定义和初始化1.4结构体大小计算内存对齐知识1.4.1修改默认对齐数 1.5结构体传参1.6结构体实现位段1.6.1什么是位段1.6.2位段的内存分配1.6.3位段的跨平台问题 二、认贼作父---枚举2.1枚举类型的定义2.2枚举定义变量2.3枚举的优点 三、贼眉鼠眼---联合3.1联合类型的定义3.2联合特点3.3联合大小的计算 一、乱臣贼子—结构体 首先是最难对付的乱臣贼子—结构体他的体量最大是各种值的集合这些值称为成员变量。每个成员可以是不同类型的变量 1.1结构体类型的声明 struct tag结构体标签 { member list }variable-list;例如想描述一个学生 struct Stu {char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号 }; //分号不能丢这里的struct 和名称标签Stu两者合起来整体算一个类型名 1.1.1特殊的声明 在声明结构体时我们可以不完全的声明 如 //匿名结构体类型 struct {int a;char b;float c; }x; struct {int a;char b;float c; }a[20], *p;可以看到上述两种结构体类型的声明都没有给出名称标签tag 那么问题来了 在上述两个匿名结构体类型成员变量都相同的这种情况下 px是合法的吗即编译器会将他们俩识别为同一个吗 答案是不会的所以是非法的 同时要注意因为这个结构体类型是匿名的所以我们后续是无法调用的只能在刚创建时定义变量。 1.2结构体的自引用 当然的我们也可以在结构体中引用自身 struct node {int datastruct node NEXT; }; //这个可行吗这个是不行的因为如果这样嵌套自身的话会无限套娃那么sizeofstruct node的结果就无法计算了 正确如下 struct Node {int data;struct Node* next; };1.3结构体变量的定义和初始化 //1定义 struct Point {int x;int y; }p1; //声明类型的同时定义变量 struct Point P2 //后面再用该类型定义变量//2初始化定义变量同时赋初值 struct Point p3{1,3};//定义变量的同时赋初值 struct Stu //声明一个学生类型 {char name[15]; //存放姓名信息int age; //存放年龄信息 }s; //声明同时定义变量 s{zhangsan,15}; //赋初值//3嵌套初始化 struct Node {int a;struct Point p; //嵌套前面的结构体类型struct Node*NEXT; //引用自身 }n1{5,{2,4},NULL}; //结构体嵌套初始化struct Node n2{2{3,0}NULL} //结构体嵌套初始化1.4结构体大小计算内存对齐知识 这块儿知识十分重要噢 我们先来看下面这一段代码 struct Stu {char name[15];int age; }; printf(%d\n,sizeof(struct Stu));大家觉得这个代码结果会是什么呢 实际结果如下 有同学或许会纳闷name数组占15个字节空间age整型占4字节空间154不是19个字节吗 这就涉及到结构体内存对齐的规则了 1.结构体第一个成员存放在结构体变量初始0偏移的位置 2.从第二个成员开始存放的位置是其对齐数的整数倍处对齐数为最大对齐数和当前成员变量大小之间的较小值其中不同编译器默认对齐数不同vs默认为8如果成员是数组则看元素类型大小 3.结构体的总大小应为最大对齐数的整数倍最大对齐数所有成员变量对齐数中最大的 4.如果嵌套了结构体对于该结构体成员来说应对齐到自身内部成员中的最大对齐数的整数倍此时结构体的大小也为最大对齐数嵌套结构体内部成员的对齐数也要参与比较的整数倍 看到这里很多同学可能会比较疑惑这种内存对齐的操作不是会浪费内存空间降低内存利用率吗为什么要有这样的规定 查阅了大部分资料总结为以下两点 平台原因(移植原因) 不是所有的硬件平台都能访问任意地址上的任意数据的某些硬件平台只能在某些地址处取某些特 定类型的数据否则抛出硬件异常。性能原因 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于为了访问未对齐的内存处理器需要作两次内存访问而对齐的内存访问仅需要一次访 问。因为在32位的系统中内存每次只能读取4个字节而如果内存数据不是对齐放着的话很多时候需要我们对内存进行多次访问才能读完所需的数据 总结 其实这种内存对齐的操作本质上就是以空间换取时间 所以如果我们要使结构体既满足结构对齐又不那么浪费空间。就要在以后设计的时候尽量让所占用字节小的成员变量集中在一起。 1.4.1修改默认对齐数 这就要用到预处理指令#pragma pack() 具体如下 #pragma pack(1) //将默认对齐数修改为1 struct S1 {char c1;int age; }; #pragma pack() //恢复默认对齐数注意在修改时最好是2的倍数因为内存一次是读取4个字节要方便读取 1.5结构体传参 这里有两种传参的方式 一是传结构体变量自身过去 二是结构体变量的地址过去 如下 struct Stu {char name[15];int age; }s;void Print1(struct Stu a) //结构体传参 {printf(%d\n,a.age); } void Print2(struct Stu *p) //结构体地址传参 {printf(%d\n,p-age); } Print1(s); Print2(s);两种方法都是可行的但是哪个函数的实现好些呢 答案是Print2 因为函数传参时参数是需要压栈的。如果传递一个结构体对象时结构体过大参数压栈开销就会比较大所以会使性能下降。而传址调用地址大小是固定的只有4/8字节大小32位系统地址大小都是4字节64位为8压栈开销就很小。 所以结构体传参时要传地址 1.6结构体实现位段 1.6.1什么是位段 位段的声明和结构是类似的有两个不同 1.位段的成员必须是 int、unsigned int 、signed int或者char属于整型家族类型 2.位段的成员名后边有一个冒号和一个数字。 如下 struct s {int a: 2; char b: 1;unsigned int c:4; }; //A就是一个位段类型1.6.2位段的内存分配 1.位段的空间上是按照需要以4个字节 int 或者1个字节 char 的方式来开辟的。 2.位段冒号后面的数字表示分配给这个变量几个比特的空间。 3.位段涉及很多不确定因素位段是不跨平台的注重可移植的程序应该避免使用位段。 4.在开辟的空间分配完当前变量还有剩余且满足下一个成员变量所需时会使用剩余空间但是当剩余内存不满足下一次需要时是否仍会使用剩余变量的行为是未定义的在不同的系统下可能会使用也可能不会这也就涉及了下面要讲的跨平台性的问题 1.6.3位段的跨平台问题 int 位段被当成有符号数还是无符号数是不确定的。位段中最大位的数目不能确定。16位机器最大1632位机器最大32写成27在16位机 器会出问题。位段中的成员在内存中从左向右分配还是从右向左分配标准尚未定义。当一个结构包含两个位段第二个位段成员比较大无法容纳于第一个位段剩余的位时是舍弃剩余的位还是利用这是不确定的。 总结 跟结构相比位段可以达到同样的效果但是可以很好的节省空间但是有跨平台的问题存在。 二、认贼作父—枚举 枚举就是把可能的值一一列举 比如我们现实生活中 一周的星期一到星期日是有限的7天可以一一列举。 性别有男、女、保密也可以一一列举。 月份有12个月也可以一一列举 这里就可以使用枚举了。 2.1枚举类型的定义 enum Day //星期 {Mon,Tues,Wed,Thur,Fri,Sat,Sun }; enum Sex //性别 {MALE,FEMALE,SECRET };enum Day、enum Sex就是枚举类型 {}中的内容是枚举类型的可能取值也叫枚举常量 。 这些可能取值都是有值的默认从0开始一次递增1当然在定义的时候也可以赋初值。 enum Color {BLUEREDYELLOW24 //赋初值从赋初值的位置往下值递增1前面的值照常从0开始递增1GREEN }; //BLUE对应值为0 //RED对应值为1 //YELLOW对应值为24 //GREEN对应值为252.2枚举定义变量 只能拿枚举常量给枚举变量赋值这样才不会产生类型差异 2.3枚举的优点 我们可以使用 #define 定义常量为什么非要使用枚举 枚举的优点 增加代码的可读性和可维护性和#define定义的标识符比较枚举有类型检查更加严谨。防止了命名污染封装便于调试使用方便一次可以定义多个常量 三、贼眉鼠眼—联合 联合也是一种特殊的自定义类型 这种类型的定义也包含一系列成员不过特殊的是这些成员公用同一块内存空间因此联合体也叫共用体 3.1联合类型的定义 union Un //联合类型的声明 {char a[5];int b; }; // 联合类型变量的定义 union Un un;3.2联合特点 联合的成员是公用同一块空间的这样一个联合变量的大小至少是最大成员的大小因为至少得有能力保存那个最大成员 union Un {char a[5];char b[2]; }; //下面这两个输出结果一样吗 printf(%p\n,a); printf(%p\n,b);这两个输出结果应该是一样的 联合体变量中的成员char a[5] 和 char b[2]是用同一块空间的所以它们的初始地址也是相等的 接着来观察下面这一串代码 union Un {int a;int b; }; union Un un; //下面这两个输出结果是什么 un.a2; un.b3; printf(%s\n,un.a); printf(%s\n,un.b);结果为3 还是因为a和b共用空间所以当一个值被修改时另一个值也可能会被修改 这也意味着当使用联合体时一次只能使用一个变量 3.3联合大小的计算 1.联合的大小至少是最大成员的大小。 2.当最大成员大小不是最大对齐数的整数倍的时候就要对齐到最大对齐数的整数倍。(联想结构体内存对齐) 好了今天的三兄弟也就给大家介绍到这里了欢迎大家在评论区留言指正噢
http://www.hkea.cn/news/14270528/

相关文章:

  • 伊春网站建设公司wordpress引用轮播图文件
  • 网站建设技术人员工作总结网站推广去哪家比较好
  • 浙江专业网站seo重庆品牌网站建设公司排名
  • 专注大连网站建设网页视频下载在线提取
  • 柬埔寨做网站网站wordpress数据库修改主题
  • 企业营销网站建设公司wordpress导出文章变id
  • 凌源网站建设郑州设计师网站
  • 官网建站平台外贸圈名人堂
  • 网站设计资料乐wordpress
  • 徐州模板建站哪家好网络营销的常用工具
  • 迁安网站开发西安免费做网站哪家好
  • 常州网站建站公司泉州关键词搜索排名
  • 假冒中国建设银行的网站网站设计二级页面怎么做
  • 北京网站建设哪家专业网站在线提交询盘系统 能直接发到邮箱
  • 北京营销型网站建站公司做公益的网站
  • 北京驾校网站建设个人网页设计作品html文件夹
  • 市工商联官方网站建设方案云南建设厅网站删除
  • 租个网站服务器多少钱打广告去哪个平台
  • 三门峡建设网站搜索大全搜索引擎
  • 样式表一般用于大型网站中国建筑装饰网设计师联盟
  • 江门网站制作培训学校wordpress 上传大小
  • 免费html网站代码制作公司网页及oa
  • 郑州网站制作案例甘肃路桥建设集团公司网站
  • 免费网站站平面设计是什么专业学的
  • 网站域名可以改么wordpress发布文章到指定页面
  • 深圳市城乡住房和建设局网站首页网站建设与管理吴振峰ppt
  • 襄樊市网站建设公司天津市招投标信息网
  • 仓库系统erp好学吗制作网站找云优化
  • 企业网站备案那么麻烦吗公司广告牌制作
  • 做文案策划需要用到的网站拼多多推广引流软件免费