变量、内存属性、作用域、生命期

    xiaoxiao2021-03-25  151

    一 内存分布 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

    转载请注明原文地址: https://ju.6miu.com/read-3434.html

    最新回复(0)