chapter12学习笔记(五)
chapter12学习笔记(五)
章节概要
Register Variables
register,就是我们平常说的寄存器,可以说是计算机存取最快的内存了(the fastest memory)
一般的变量都是存放在计算机的内存中的,但是 register variable 和他们就不一样,寄存器变量比较幸运(with lucky),它能够存储在寄存器中!这通常意味着这个变量需要频繁访问,读取
但是这也是有代价的,你无法读取寄存器变量的内存地址(address)
除此之外,他们与自动型变量(automatic variable)没什么区别,甚至可能就是自动型变量,因为编译器会进行优化,如果我们对于一个定义为寄存器类型的变量访问不是很频繁,它就会把这个变量变成自动型变量
这也是为什么我们要说 幸运 这个词了,因为即便是寄存器变量,也只是有一定几率会存放进寄存器
使用寄存器变量可以使用如下形式:
1 | int main(void) |
也就是:
1 | register 类型 标识符; |
这样就完成了寄存器变量的声明(declare)
Static Variables with Block Scope
关于静态变量,要注意的是静态变量,静 的是内存地址(stays put in memory),而非变量的值
一般而言,全局变量(file scope)具有且一定具有静态属性,但是,我们也可以手动创建具有静态属性的本地变量,这些变量不会在函数结束后或括号范围外自动消失,块级作用域,没有连接属性(no linkage),但是有静态存储的生命周期(duration),例如:
1 | /* loc_stat.c -- using a local static variable */ |
输出效果如下:
1 | Here comes iteration 1: |
可见,变量stay
只被初始化了一次,函数结束时内存地址被保留,其中的值自然也被留下,但是变量fade
则是每次唤起函数trystat
时重新分配地址赋值,所以才会产生这样的输出
我们看到这两个声明:
1 | int fade = 1; |
通过调试,我们可以知道,第一句是函数的一部分,每次函数执行时都会执行,而第二句就不同了,在调试时我们可以看到,我们似乎是跳过了这一步,事实上,静态变量和external variable在程序被加载到内存时就已经完成初始化了,而将其声明语句放在trystat
函数内,是为了告诉编译器,只有在这个函数内,这个变量才是可见的
所以,我们是不可以使用静态变量作为函数参数的
1 | int wontwork(static int flu); // not allowed |
在一些老的C语言文献里,这样的静态变量还被称为internal static storage class,当然,这里的internal不是指internal linkage,而是internal to a function
本次博客就写到这里,谢谢大家的阅读与支持