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

如何添加网站关键词怎么制作页面视频

如何添加网站关键词,怎么制作页面视频,做网站甲方乙方公司的区别,IC 网站建设以下内容源于朱有鹏嵌入式课程的学习#xff0c;如有侵权#xff0c;请告知删除。 补充#xff1a;https://blog.csdn.net/oqqHuTu12345678/article/details/71214255 一、概念集合 1、存储类 #xff08;1#xff09;存储类就是存储类型#xff0c;也就是描述C语言变…以下内容源于朱有鹏嵌入式课程的学习如有侵权请告知删除。 补充https://blog.csdn.net/oqqHuTu12345678/article/details/71214255 一、概念集合 1、存储类 1存储类就是存储类型也就是描述C语言变量在何种地方存储。 2内存有多种管理方法栈、堆、数据段、bss段、.text段代码段……一个变量的存储类属性就是描述这个变量存储在何种内存段中。 譬如局部变量分配在栈上所以它的存储类就是栈显式初始化为非0的全局变量分配在数据段显式初始化为0和没有显示初始化默认为0的全局变量分配在bss段。2、作用域 1作用域是描述这个变量起作用的代码范围。 2基本来说C语言变量的作用域规则是代码块作用域。 即这个变量起作用的范围是当前的代码块。代码块就是一对大括号{}括起来的范围所以一个变量的作用域是这个变量定义所在的{}范围内从这个变量定义开始往后的部分。(这就解释了为什么变量定义总是在一个函数的最前面)3、生命周期 1生命周期是描述这个变量什么时候诞生运行时分配内存空间给这个变量及什么时候死亡运行时收回这个内存空间此后再不能访问这个内存地址或者访问这个内存地址已经和这个变量无关了的。 2变量和内存的关系就和人变量去图书馆借书内存一样。变量的生命周期就好象我人借书的这段周期一样。 3研究变量的生命周期可以我们理解程序运行的一些现象、理解C语言的一些规则。 4、链接属性 1程序从源代码到最终可执行程序经历的过程编译、链接。 编译阶段就是把源代码搞成.o目标文件。目标文件里面有很多符号和代码段、数据段、bss段等分段。符号就是编程中的变量名、函数名等。运行时变量名、函数名能够和相应的内存对应起来靠符号来做链接的。 2.o的目标文件链接生成最终可执行程序的时候其实就是把符号和相对应的段给链接起来。 3C语言中的符号有三种链接属性外连接属性、内链接属性、无连接属性。 二、linux下C程序的内存映像 1、代码段、只读数据段 对应着程序中的代码函数代码段在linux中又叫文本段(.text)只读数据段就是在程序运行期间只能读不能写的数据const修饰的常量有可能是存在只读数据段的但是不一定const常量的实现方法在不同平台是不一样的 2、数据段、bss段 数据段存1、显式初始化为非0的全局变量2、显式初始化为非0的static局部变量bss段存1、显式初始化为0或者未显式初始化的全局变量2、显式初始化为0或未显式初始化的static局部变量。3、堆 C语言中什么样变量存在堆内存中C语言不会自动向堆中存放东西堆的操作是程序员自己手工操作的。程序员根据需求自己判断要不要使用堆内存用的时候自己申请自己使用完了自己释放。4、文件映射区 文件映射区就是进程打开了文件后将这个文件的内容从硬盘读到进程的文件映射区以后就直接在内存中操作这个文件读写完了后在保存时再将内存中的文件写到硬盘中去。5、栈 局部变量分配在栈上函数调用传参过程也会用到栈 7、内核映射区 内核映射区就是将操作系统内核程序映射到这个区域了。对于linux中的每一个进程来说它都以为整个系统中只有它自己和内核而已。它认为内存地址0xC0000000以下都是它自己的活动空间0xC0000000以上是OS内核的活动空间。每一个进程都活在自己独立的进程空间中0-3G的空间每一个进程是不同的因为用了虚拟地址技术但是内核是唯一的。8、OS下和裸机下C程序加载执行的差异 1C语言程序运行时环境有一定要求 意思是单独个人写的C语言程序没法直接在内存中运行需要外部一定的协助这段协助的代码叫加载运行代码或者叫构建C运行时环境的代码这一段代码在操作系统下是别人写好的会自动添加到我们写的程序上这段代码的主要作用是给全局变量赋值、清bss段。2ARM裸机第十六部分写shell时有一次定义了一个全局变量初始化为0但是实际不为0后来在裸机的start.S中加了清bss段代码就变0了。 这就说明在裸机程序中没人帮我们来做这一段加载运行时代码要程序员自己做start.S中的重定位和清bss段就是在做这个事在操作系统中运行程序时程序员自己不用操心会自动完成重定位和清bss所以我们看到的现象C语言中未初始化的全局变量默认为0。3数据段的全局变量或静态局部变量都是有非0的初值的这些初值在main函数运行之前就已经被初始化了是重定位期间完成的初始化。 三、存储类相关的关键字 1、auto auto关键字在C语言中只有一个作用那就是修饰局部变量。平时定义局部变量时就是定义的auto的只是省略了auto关键字而已。可见auto的局部变量其实就是默认定义的普通的局部变量。2、static 1static的第一种用法是用来修饰局部变量形成静态局部变量。 要搞清楚静态局部变量和非静态局部变量的区别。本质区别是存储类不同存储类不同就衍生出很多不同。非静态局部变量分配在栈上而静态局部变量分配在数据段/bss段上。2static的第二种用法是用来修饰全局变量形成静态全局变量。 要搞清楚静态全局变量和非静态全局变量的区别。区别是在链接属性上不同。3、register 1register修饰的变量。编译器会尽量将它分配在寄存器中平时分配的一般的变量都是在内存中的 分配在寄存器中一样的用但是读写效率会高很多。所以register修饰的变量用在那种变量被反复高频率的使用通过改善这个变量的访问效率可以极大的提升程序运行效率时。所以register是一种极致提升程序运行效率的手段。2uboot中用到了一个register类型的变量gd 这个变量是用来存uboot的全局变量gd就是global data。因为这个全局变量在整个uboot中到处都被访问所以定义成register的。3平时写代码要被定义成register这种情况很少一般慎用。 4register编译器只能承诺尽量将register修饰的变量放在寄存器中但是不保证一定放在寄存器中。主要原因是因为寄存器数量有限不一定有空用。 4、extern 1extern主要用来声明全局变量声明的目的主要是在a.c中定义全局变量而在b.c中使用该变量。 C语言中程序的编译时以单个.c源文件为单位的因此编译a.c时只考虑a.c中的内容不会考了b.c的内容这就导致a.c中使用了b.c中定义的变量时在编译时报错。解决方案是声明。应该在a.c中使用g_b之前先声明g_b声明就是告诉a.c我在别的文件中定义了g_b并且它的原型和声明的一样将来在链接的时候链接器会在别的.o文件中找到这个同名变量。声明一个全局变量就要用到extern关键字5、volatile 1C语言中volatile用来修饰一个变量表示这个变量可以被编译器之外的东西改变。 编译器之内的意思是变量的值的改变是代码的作用编译器之外的改变就是这个改变不是代码造成的或者不是当前代码造成的编译器在编译当前代码时无法预知。譬如在中断处理程序isr中更改了变量的值譬如多线程中在别的线程更改了这个变量的值譬如硬件自动更改了这个变量的值一般这个变量是一个寄存器的值。中断isr中引用的变量多线程中共用的变量硬件会更改的变量三者都是编译器在编译时无法预知的更改此时应用使用volatile告诉编译器这个变量属于这种可变的、易变的情况。编译器在遇到volatile修饰的变量时就不会对改变量的访问进行优化就不会出现错误。2编译器的优化在一般情况下非常好可以帮助提升程序效率。但是在特殊情况volatile下变量会被编译器想象之外的力量所改变此时如果编译器没有意识到而去优化则就会造成优化错误优化错误就会带来执行时错误。而且这种错误很难被发现。 3volatile是程序员意识到需要volatile然后在定义变量时加上volatile如果你遇到了应该加volatile的情况而没有加程序可能会被错误的优化。如果在不应该加volatile而加了的情况程序不会出错只是会降低效率。所以我们对于volatile的态度应该是正确区分该加的时候加不该加的时候不加如果不能确定该不该加为了保险起见就加上。 6、restrict 1c99中才支持的所以很多延续c89的编译器是不支持restrict关键字gcc支持的。 2restrict也是和编译器行为特征有关的。 3restrict只用来修饰指针不能修饰普通变量。 4http://blog.chinaunix.net/uid-22197900-id-359209.html 5memcpy和memmove的区别 7、typedef typedef在C语言关键字归类上属于存储类关键字但是实际上和存储类没关系。四、作用域详解 1、局部变量的代码块作用域 代码块基本可以理解为一对大括号{}括起来的部分。代码块不等于函数因为if  while for都有{}。所以代码块函数。局部变量的作用域是代码块作用域也就是说一个局部变量可以被访问和使用的范围仅限于定义这个局部变量的代码块中定义式之后的部分。2、函数名和全局变量的文件作用域 文件作用域的意思就是全局的访问权限也就是说整个.c文件中都可以访问这些东西。这就是平时所说的局部和全局全局就是文件作用域。详细准确的说函数和全局变量的作用域是定义所在的整个.c文件之内定义式之后的部分。3、注意 在c89标准的编译器中现在很多编译器还延续使用c89标准所有的局部变量必须先定义在最前面在变量定义之前不能有一句执行代码。在c99标准的编译器中gcc兼容c99标准可以允许在代码块内任意地方定义变量。但是允许定义的变量还是只能使用在定义了之后定义之前还是不能用的。4、同名变量的掩蔽规则 问题编程时不可避免会出现同名变量。变量同名后不一定会出错。首先如果两个同名变量作用域不同且没有交叠这种情况下同名没有任何影响。其次如果两个同名变量作用域有交叠C语言规定在作用域交叠范围内作用域小的一个变量会掩蔽掉作用域大的那个县官不如现管。五、变量的生命周期 1、栈变量的生命周期 局部变量栈变量存储在栈上生命周期是临时的。临时的意思就是说代码执行过程中按照需要去创建、使用、消亡的。譬如一个函数内定义的局部变量在这个函数每一次被调用时都会创建一次然后使用最后在函数返回的时候消亡。思考一个函数内的局部变量为什么在函数外不能使用思考局部变量为什么分配在栈上或者说局部变量为什么是临时生命周期2、堆变量的生命周期 首先要明白堆内存空间是客观存在的是由操作系统维护的。我们程序只是去申请然后使用然后释放。我们只关心我们程序使用堆内存的这一段时间因此堆变量也有了自己的生命周期就是从malloc申请时诞生然后使用直到free时消亡。所以堆内存在malloc之前和free之后不能再去访问因此堆内存在实践编程时都是被反复的malloc和free的。3、数据段、bss段变量的生命周期 全局变量的生命周期是永久的。永久的意思就是在程序被执行时诞生在程序终止时消亡。全局变量所占用的内存是不能被程序自己释放的所以程序如果申请了过多的全局变量会导致这个程序一直占用大量内存。4、代码段、只读段的生命周期 其实就是程序执行的代码其实就是函数它的生命周期是永久的。不过一般代码的生命周期我们并不关注。有时候放在代码段的不只是代码还有const类型的常量还有字符串常量。const类型的常量、字符串常量有时候放在rodata段有时候放在代码段取决于平台六、链接属性 1、C语言程序的组织架构多个C文件多个h文件 (完整的一个C语言程序譬如linux内核、uboot由多个c文件和多个h文件组成的。程序的生成过程就是编译链接。编译是为了将函数/变量等变成.o二进制的机器码格式链接是为了将各个独立分开的二进制的函数链接起来形成一个整体的二进制可执行程序。 2、编译以文件为单位、链接以工程为单位 编译器工作时是将所有源文件依次读进来单个为单位进行编译的。链接的时候实际上是把第一步编译生成个单个的.o文件整体的输入然后处理链接成一个可执行程序。 3、三种链接属性外连接、内链接、无链接 外连接的意思就是外部链接属性也就是说这家伙可以在整个程序范围内言下之意就是可以跨文件进行链接譬如普通的函数和全局变量属于外连接。内链接的意思就是c文件内部内部链接属性也就是说这家伙可以在当前c文件内部范围内进行链接言下之意就是不能在当前c文件外面的其他c文件中进行访问、链接。static修饰的函数/全局变量属于内链接。无连接的意思就是这个符号本身不参与链接它跟链接没关系。所有的局部变量auto的、static的都是无连接的 4、函数和全局变量的同名冲突 1因为函数和全局变量是外部链接属性就是说每一个函数和全局变量将来在整个程序中所有的c文件都能被访问因此在一个程序中的所有c文件中不能出现同名的函数/同名的全局变量。 2最简单的解决方案就是起名字不要重复但是很难做到。主要原因是一个很大的工程中函数和全局变量名字太多了而且一个大工程不是一个人完成的是很多人协作完成所以很难保证不会重名。解决方案呢 3现代高级语言中完美解决这个问题的方法是命名空间namespace其实就是给一个变量带上各个级别的前缀。但是C语言不是这么解决的。 C语言比较早碰到这个问题当时还没发明namespace概念当时C语言就发明了一种不是很完美但是凑活能用的解决方案就是三种链接属性的方法。C语言的链接属性解决重名问题思路是这样的我们将明显不会在其他c文件中引用只在当前c文件中引用的函数/全局变量使用static修饰使其成为内链接属性这样在将来连接时即使2个c文件中有重名的函数/全局变量只要其中一个或2个为内链接属性就没事。这种解决方案在一定程度上解决了问题。但是没有从根本上解决问题留下了很多麻烦。所以这个就导致了C语言写很大型的项目难度很大。5、static的第二种用法修饰全局变量和函数 普通的非静态的函数/全局变量默认的链接属性是外部的static静态的函数/全局变量链接属性是内部链接。七、总结 1、普通自动局部变量分配在栈上作用域为代码块作用域生命周期是临时连接属性为无连接。定义时如果未显式初始化则其值随机变量地址由运行时在栈上分配得到多次执行时地址不一定相同函数不能返回该类变量的地址指针作为返回值。 2、静态局部变量分配在数据段/bss段显式初始化为非0则在数据段显式初始化为0或未显示初始化则在bss段作用域为代码块作用域人为规定的生命周期为永久天然的链接属性为无连接天然的。定义时如果未显式初始化则其值为0天然的变量地址由运行时环境在加载程序时确定整个程序运行过程中唯一不变静态局部变量其实就是作用域为代码块作用域同时链接属性为无连接的全局变量。静态局部变量可以改为用全局变量实现程序中尽量避免用全局变量因为会破坏结构性。 3、静态全局变量/静态函数和普通全局变量/普通函数的唯一差别是static使全局变量/函数的链接属性由外部链接整个程序所有文件范围转为内部链接当前c文件内。这是为了解决全局变量/函数的重名问题C语言没有命名空间namespace的概念因此在程序中文件变多之后全局变量/函数的重名问题非常严重将不必要被其他文件引用的全局变量/函数声明为static可以很大程度上改善重名问题但是仍未彻底解决。 4、写程序尽量避免使用全局变量尤其是非static类型的全局变量。能确定不会被其他文件引用的全局变量一定要static修饰。 5、注意区分全局变量的定义和声明。一般规律如下如果定义的同时有初始化则一定会被认为是定义如果只是定义而没有初始化则有可能被编译器认为是定义也可能被认为是声明要具体分析如果使用extern则肯定会被认为是声明实际上使用extern也可以有定义实际上加extern就是明确声明这个变量为外部链接属性。 6、全局变量应该定义在c文件中并且在头文件中声明而不要定义在头文件中因为如果定义在头文件中则该头文件被多个c文件包含时该全局变量会重复定义。 7、在b.c中引用a.c中定义的全局变量/函数有2种方法一是在a.h中声明该函数/全局变量然后在b.c中#include a.h二是在b.c中使用extern显式声明要引用的函数/全局变量。其中第一种方法比较正式。 8、存储类决定生命周期作用域决定链接属性。 9、宏和inline函数的链接属性为无连接。
http://www.zqtcl.cn/news/863281/

相关文章:

  • 建设银行集团网站首页优化科技
  • dede 汽车网站网站上的彩票走势图是怎么做的
  • 网站内容营销呼市推广网站
  • 南宁网站建设价格医院有关页面设计模板
  • 城乡住房和城乡建设厅网站湖州公司网站建设
  • h5响应式的网站建站空间哪个好
  • 徐州网站建设与推广公众号开发技术风险
  • 男女做差差事的视频网站自己做一个小程序要多少钱
  • 临沂网站建设哪家好重庆建设招标造价信息网站
  • 筑巢网络官方网站深圳网站开发设计公司排名
  • 镇江市网站制作网页的代码实例
  • 吉林省网站制作公司有哪些唐山设计网站公司
  • 浙江国泰建设集团有限公司网站ps软件下载电脑版免费怎么下载
  • 昆明网站建设价格自力教育
  • 黄冈网站推广软件视频下载孝感做网站xgsh
  • 用jsp做一网站的流程图互联网博客网站
  • 南宁一站网 给网站做营销微网站和网站同步像素
  • 如何建设一个视频小网站软件做网站
  • 小企业网站建设公司哪家好网站怎样设计网页
  • 那个网站做搬家推广比较好wordpress twenty eleven
  • 微站图片临淄信息网招聘最新信息
  • 投诉举报网站建设方案宠物网站 模板
  • 生小孩去什么网站做登记有特点的个人网站
  • 汉中市住房和城乡建设局网站学网站建设需要什么
  • 深圳网站建设外包公司排名网络引流怎么做啊?
  • 关于做暧暧的网站php 网站授权
  • 网站上添加子栏目wordpress群组
  • 一站式手机网站制作有没有代做ppt的网站
  • 西安火车站网站建设网站的设计需要什么
  • 弹幕网站开发代码欧洲人喜欢什么样的服务器