变量、内存属性、作用域、生命期
来源:互联网 发布:上帝会掷骰子知乎 编辑:程序博客网 时间:2024/06/05 07:37
一 内存分布
w- 写 r - 读 e - 执行 s - 共享
1.1.同个程序同时运行多个实例,它们之间的内存是相互隔离的,同一个变量的值互补干扰。
1.2.早前微软对内存中数据的属性:e - 执行不做检查,内存中能访问到的数据都可以作为代码来执行,这样其实可以在很多地方去构造想要执行的代码,通过修改函数的返回地址,或者修改程序中的跳转,将执行地址定位到构造好的位置,从而实现了内存代码注入的效果。微软在后来修复了这个纰漏,推出了Dep即数据执行保护(可研究绕过方法)
二、作用域 与 生命周期
- 进程作用域:如:全局变量
- 文件作用域:跨文件 extern
- 函数作用域:参数和局部变量
- 块作用域:用一对大括号囊括在内的区域
int g_nValue = 1024;//g_nValue进程作用域,生命期从载入程序到进程结束void fun(int ary[], int nLen){ g_nValue = 199;//全局变量,函数内部也可以使用}int main(){ int nCnt = 9; { int nCnt = 7;//作用域在当前括弧内,生命期与外部int nCnt = 9相同 printf("%d", nCnt); } { printf("%d", nCnt);//访问int nCnt = 9 }return 0;}
三 寄存器变量
当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。
1.只有局部自动变量和形参才可以定义为寄存器变量。
因为寄存器变量属于动态存储方式,凡需要采用静态存储方式的量都不能定义为寄存器变量,包括:模块间全局变量、模块内全局变量、局部static变量。
2.register是一个”建议”型关键字,意指程序建议该变量放在寄存器中,但最终该变量可能因为条件不满足并未成为寄存器变量,而是被放在了存储器中,但编译器中并不报错(在C++语言中有另一个”建议”型关键字:inline)。
3.对于寄存器变量,在Debug环境中,均没有将变量地址设置为寄存器,主要考虑Debug环境中的调试功能
但是在Release环境下,不管有没有将变量设置为register类型,均会优先将变量地址设置到寄存器地址
百度百科:
http://baike.baidu.com/link?url=nK-T4_6k8MEZyln3k7kjO6cqsP2R3Jf5b8fTLgxRDJwikCkvW9-W2AhVuzocxQ7ZZZCUaiRnmesYSaQYD-QS2KqFKWV0D2Jda3dhTu8JpFG535i3LbWgHF2Ch8PgZEzxXbPhBtqI1Sa3-z8IoNTvGq
- 变量、内存属性、作用域、生命期
- 关于局部变量,全局变量,作用域,生命期的概念,程序内存分析
- 局部变量,全局变量,静态变量的作用域,生命期?
- 变量(对象)“生命期”和“作用域”的关系
- c++类作用域,对象生命期,const限定1
- 变量、作用域、内存
- 变量及函数的生存期、作用范围、链接属性
- 变量的作用域和存储期
- 变量的作用域及生存期
- 变量的生存期和作用域
- 变量的作用域和生存期
- 变量的作用域和生存期
- C语言中变量的作用域和生命…
- C++非局部变量生命期
- JavaScript 变量作用域 & 内存
- [JavaScript]-----变量,作用域,内存
- 变量作用域及内存
- JavaScript 变量 作用域 内存
- Java并发编程:Timer和TimerTask(转载)
- 关于C指针的一些理解
- Android Fragment两种适配FragmentPagerAdapter与FragmentStatePagerAdapter
- 简单易学的机器学习算法——Mean Shift聚类算法
- iOS swift3.0 下闭包语法整理
- 变量、内存属性、作用域、生命期
- 如何用AngularJS构建管理后台
- liunx查看tomcat 版本,重启tomcat 及查看日志
- MySQL免解压遇到的一些问题
- 输入和输出
- Eclipse使用Mybatis Generator生成pojo对象、mapper接口和mapper.xml文件
- JavaScript-01----包装对象、比较、隐式转化、类型检测
- 欢迎使用CSDN-markdown编辑器
- 基于Nodejs生态圈的TypeScript+React开发入门教程