打印

C语言初始化效率问题以及关键字解释

[复制链接]
140|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
考哥|  楼主 | 2018-8-22 12:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、初始化效率




1、在静态变量的初始化中,我们可以把可执行程序文件想要初始化的值放在当程序执行时变量将会使用的位置。当可执行文件载入到内存时,这个已经保存了正确初始值的位置将赋值给那个变量,完成这个任务并不需要额外的时间,也不需要额外的指令,变量将会得到正确的值、




2、自动变量当程序链接时还无法判断自动变量的存储位置。事实上,函数的局部变量在函数的每次调用中可能占据不同的位置。基于这个理由,自动变量没有缺省的初始值,而显示的初始化将在代码块的其实出插入一条隐式的赋值语句。




一句话总结;局部变量的初始化与分开写毫无区别




即什么时候使用变量什么时候声明,尽量重用,不要让他隐式初始化,浪费内存




static 关键字的修饰。




当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明他们的源文件中访问。




总结:




一下以文件解释




int a;




//a 变量存储在静态内存




特点:




在程序运行之前创建




可以被其他的C文件访问以及它的下方函数使用




初始化值为0




=================




static int a;




特点:在程序运行之前存在




静态内存存储




不能被其他文件访问




================




代码块中的变量




static int a ;




静态变量




与int a ;(局部变量)




的区别是:




一个存储在静态内存 也就是普通内存




另一个是局部变量,也就是运行时堆栈




函数上添加static的话:




不能被其他的文件访问该函数




几个关键字的处理




static 静态内存




auto 运行时堆栈




register 硬件寄存器




external 引用外部文件变量函数




internal 引用内部文件变量函数




=======================




关于代码块变量被static修饰




保证该函数多次调用时,我们为了防止该变量不变




进行的处理比如我们进行了多次的调用




二、关键字解释




变量的存储类型(storage class )是指存储变量值的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。有三个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。在这三个地方存储的变量具有不同的特性。




变量的缺省存储类型取决于它的声明位置。凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量成为静态变量。对于这类变量,你无法为他们制定其他存储类型。




静态变量在程序运行之前创建,在程序的整个执行期间始终存在。它始终保持原先的值,除非给它赋一个不同的值或者程序结束。




在代码块内部声明的变量的缺省存储类型是自动的(automatic),也就是说他存储于堆栈中,成为自动变量。有一个关键字auto就是用修饰这种存储类型的,但它极少使用,因为代码块中的变量在缺省情况下就是自动变量在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开该代码时,这些自动变量便自行销毁。如果该代码块被数次执行,例如一个函数被反复调用,这些自动变量每次都将重新创建。在代码块再次执行时,这些自动变量在堆栈中所占据的内存位置有可能和原先的位置相同,也可能不同。及时他们所占据的位置相同,你也不能保证这块呢村同时不会有其他的用途,因此,我们可以说自动变量在代码块执行完毕后就消失。当代码块再次执行时,他们的值一般并不是上次执行时的值。




对于在代码块内部声明的变量,如果给它加上关键字static,可以使他的存储类型从自动变为静态。具有静态存储类型的变量在整个程序执行过程中一直存在,而不仅仅在声明它的代码块的执行时存在。注意,修改变量的存储类型并不标示修改该变量的作用域,它任然只能在该代码块内部按名字访问。函数的形式参数不能声明




最后,关键字register可以用于自动变量的声明,提示他们应该存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。通常,寄存器变量比存储于内存的变量访问起来效率更高。但是,编译器并不一定要理财register关键字,如果有太多的变量被声明为register,它只选取前几个实际存储于寄存器中,其余的就按普通自动比那辆处理。如果一个编译器自己具有一套寄存器优化方法,它可能忽略register关键字,




使用:使用说明,为了加快程序的编译速度,你希望把使用频率最高的那些变量声明为寄存器变量,在有些计算机中,如果你把指针声明为寄存器变量,程序的效率将能得到提高,有其是那些频繁的执行间接访问操作的指针,你可以把函数的形式参数声明为寄存器变量,编译器会在函数的起始位置生成指令,把这些值从堆栈复制到寄存器中。但是,完全有可能,这个优化措施所节省的时间和控件的开销还抵不上复制这几个值所用的开销。




寄存器变量的创建和销毁时间和自动变量相同,但它需要一些额外的工作。在一个使用寄存器变量的函数返回之前,这些寄存器先前存储的值必须恢复,确保调用者的寄存器变量未被破坏。许多机器使用运行时堆栈来完成这个任务。当函数开始执行时,它把需要使用的所有寄存器的内容都保存到堆栈中,当函数返回时,这些值再复制回寄存器中。在许多机器的硬件实现中,并不为寄存器指定的地址。同样由于寄存器值的保存和恢复某一个特定的寄存器在不同的时刻所保存的值不一定相同。基于这些理由,机器并不像你提供寄存器变量的地址。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

461

主题

477

帖子

0

粉丝