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

南京高端网站开发百度统计登录

南京高端网站开发,百度统计登录,湛江网站seo外包,oss做下载网站文章目录 1. 自动变量(auto)1.1 自动变量的初始化 2. 静态变量(static)2.1 静态变量的初始化 3. 寄存器变量(register) 1. 自动变量(auto) 在代码块内部声明的变量的缺省存储类型是…

文章目录

  • 1. 自动变量(auto)
    • 1.1 自动变量的初始化
  • 2. 静态变量(static)
    • 2.1 静态变量的初始化
  • 3. 寄存器变量(register)

1. 自动变量(auto)

代码块内部声明的变量的缺省存储类型是自动的(automatic),也就是说它存储于堆栈中,称为自动(auto)变量。关键字auto就是用于修饰这种存储类型的,但它极少使用,因为代码块中的变量在缺省情况下就是自动变量。

在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开该代码块时,这些自动变量便自行销毁。如果该代码块被数次执行,例如一个函数被反复调用,这些自动变量每次都将重新创建。在代码块再次执行时,这些自动变量在堆栈中所占据的内存位置有可能和原先的位置相同,也可能不同。即使它们所占据的位置相同,你也不能保证这块内存同时不会有其他的用途。

因此,我们可以说自动变量在代码块执行完毕后就消失。当代码块再次执行时,它们的值一般并不是上次执行时的值

举一个例子(这个例子来自于Linux C编程一站式学习-全局变量、局部变量和作用域)

#include <stdio.h>
void foo(void)
{int i;printf("%d\n", i);i = 777; }int main(void) 
{ 	foo(); 	foo(); 	return 0; 
}

打印结果:
在这里插入图片描述
第二次调用打印的i值正是第一次调用末尾赋给i的值777?

改写一下,中间加一个打印’hello’的语句。

int main(void)
{foo();printf("hello\n");foo();return 0;
}

结果是
在这里插入图片描述
第二次调用foo打印的i值又不是777了而是0,“局部变量的存储空间在每次函数调用时分配,在函数返回时释放”

所以每一次函数的调用都是重新为自动变量分配内存的。

1.1 自动变量的初始化

自动变量的初始化需要更多的开销,因为当程序链接时还无法判断自动变量的存储位置。事实上,函数的局部变量在函数的每次调用中可能占据不同的位置。基于这个理由,自动变量没有缺省的初始值,而显式的初始化将在代码块的起始处插入一条隐式的赋值语句。这导致了:

  • 自动变量的初始化较之赋值语句效率并无提高,除了声明为const的变量之外,在声明变量的同时进行初始化和先声明后赋值只有风格之差,并无效率之别;
  • 隐式的赋值语句使自动变量在程序执行到它们所声明的函数(或代码块)时,每次都将重新初始化;(关于隐式赋值和显式赋值可以参考这个文章:关于编程语言中的显式\隐式初始化)
  • 优点:由于初始化在运行时执行,你可以用任何表达式作为初始化值;
  • 除非你对自动变量进行显式的初始化,否则当自动变量创建时,它们的值总是垃圾。

2. 静态变量(static)

变量的缺省存储类型取决于它的声明位置。凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量称为静态(static)变量

对于这类变量,无法为它们指定其他存储类型。静态变量在程序运行之前创建,在程序的整个执行期间始终存在它始终保持原先的值,除非给它赋一个不同的值或者程序结束

对于在代码块内部声明的变量,如果给它加上关键字static,可以使它的存储类型从自动变为静态。注意,修改变量的存储类型并不表示修改该变量的作用域,它仍然只能在该代码块内部按名字访问。函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归

2.1 静态变量的初始化

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

3. 寄存器变量(register)

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

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

寄存器变量的创建和销毁时间和自动变量相同,但它需要一些额外的工作。在一个使用寄存器变量的函数返回之前,这些寄存器先前存储的值必须恢复,确保调用者的寄存器变量未被破坏。许多机器使用运行时堆栈来完成这个任务。当函数开始执行时,它把需要使用的所有寄存器的内容都保存到堆栈中,当函数返回时,这些值再复制回寄存器中。

在许多机器的硬件实现中,并不为寄存器指定地址。同样,由于寄存器值的保存和恢复,某个特定的寄存器在不同的时刻所保存的值不一定相同。基于这些理由,机器并不向你提供寄存器变量的地址

http://www.hrbkazy.com/news/44279.html

相关文章:

  • wordpress get_users合肥百度seo代理
  • 中国建设银行网站查询爱站工具包手机版
  • 学校建设网站的作用外链工具在线
  • 高端网站教建设跟我学seo从入门到精通
  • 福州做网站建设服务商百度如何添加店铺位置信息
  • 购物网站建设哪家好2022年最新新闻播报稿件
  • 抚州网站建设公司营销软件哪个好
  • 校园图书馆网站建设中国十大广告公司排行榜
  • 郑州网站加工网站媒体推广
  • 夫妻网站开发如何设计推广方案
  • 产品网站怎样做外部链接seo怎么优化简述
  • 做软件项目的网站广东seo推广方案
  • win7iis如何做网站免费b站推广网站破解版
  • 网站专题策划页面怎么做火锅店营销方案
  • 山西省网站建设制作好的营销网站
  • 网站开发标书怎么写精准推广的渠道有哪些
  • php网站分类目录程序 网址导航程序 织梦二次开发教育培训网站设计
  • 小孩做愛网站重庆森林粤语
  • wordpress 附件密码保护持续优化完善防控措施
  • 网站icon怎么设置百度url提交
  • 秦皇岛市妇幼保健院seo快速排名系统
  • 云南高端网站制作价格2022最新引流推广平台
  • 漳州网站开发去博大钱少a百度贴吧网页版
  • 高端大气的企业网站模板优化什么意思
  • 交友网站初期怎么做网站内搜索
  • 做教师知识网站有哪些想做百度推广找谁
  • 中国网站制作企业排行榜加快百度收录的方法
  • 网站设计深圳市免费检测网站seo
  • 净空老法师弟子做的免费祭祖网站google seo 优化
  • 上海做网站设计百度关键词推广工具