/*
*C++中的存储技术
*我们来讨论C++的存储技术包括C++的存储类型,C++存取修饰符和C++对象的生存期三部分
*C++存储类型
*主要有三种类型:
*extern存储,static存储,regsiter存储类型
*1.extern存储类型
*由于C语言允许将分别编译的大程序的各个模块连接在一起,以提高编译速度,协作大项目管理
*因此必须将程序需要的所有的全局变量通过某种方法告知所有的文件。
*解决以上问题的方法是:在一个文件中说明所有的全局变量,在另一个文件中使用extern再次
*描述他们。当在函数内部使用同一个全局变量。而它又在同一个文件内说明时,可以选用extern
*但一般很少这么做,在C++面向对象编程中,这种方法已经基本不再使用了,而只是在C语言的源代码
*中经常还可以看见这种方法的身影。
*2.static存储类型
*静态变量不论在函数中或在文件中都是稳定的变量。静态局部变量可以使编译程序产生于全局变量
*相同的永久性存储区,其差异是静态局部变量仅对于说明它的模块内可知。
*静态局部变量对于生成C语言的独立函数时非常重要的,因为有时候有些子程序必须在调用时保留区值
*例如:过去的数字为基数产生一个新值得数值序列发生器,如下程序:
*int series(void)
*{
* static int series_num;
* series_num += 2;
* return (series_num);
*}
*用户可以给静态局部变量赋初值,这个值仅制定一次,如下程序:
*int series(void)
*{
* static int series_num = 100;
* series_num += 23;
* return (series_num);
*}
*将分类型static用于全局变量,会使编译程序建立起仅在说明该全局变量的文件中可以认知的全局。
*因此,在静态局部变量不能满足要求的场合,就可以将需要使用静态全局变量的函数写成一个小文件
*进行单独编译而不必担心副作用。
*静态变量允许程序员能将程序的以部分隐藏起来,这对于管理一个很大很复杂的程序非常有效。
*存储类型static可以使程序员写出十分通用的函数,这些函数可以放入库中以备后用。
*3.regsiter存储类型
*这种存储类型仅仅用于int 和char类型变量。通常,regsiter要求编译程序将它说明的变量值保存起来
*保存在CPU的寄存器中,这样其运算速度就会大大快于普通的变量。
*regsiter仅可以用于局部变量和函数的形式参数,因为这些变量和字符存储在CPU的寄存器中,都是缺省的自动变量
*由于regsiter可以提高速度,因此它是最理想的循环控制变量。但是在实际应用中,由于同一时刻获取优化速度的regsiter
*变量有限。
*
*/
/*
*C++的存取修饰符
*主要有:const--常数型,volatile--暂态型
*1.const--常数型
*const型变量在程序执行期间是不可以改变的,编译程序可以随意的将这些变量放到只读存储器Rom中
*const用途:可以阻止参数被修改,即当一个指针传送给一个函数后,函数可能修改该指针所指向的变量,然而,如果指针在参数说明段
*用const修饰,函数就无法修改指针所指的内容了。
*通常,当一个标准库函数不必修改调用参数指引的对象时,参数则用const来修饰,
*2.volatile
*volatile通知编译器:变量值可能由程序中没有显示说明的方式所改变。
*全局变量的地址可能被传递到操作系统的时针子程序,用来保存系统实时时间。
*引用修饰符volatile的原因:大多数C编译程序都假定表达式内部的内容不变,并以这一假定来自动优化某些表达式。
*有些编译程序都假定表达式内部的内容不变,并以这一假定来自动优化某些表达式。有些编译程序在编译时还有改变表达式的计算顺序,volatile
*可以防止这些改变发生。
*const 和volatile可以一起使用,例如:如果假定0x80是仅由外部条件改变的端口的值,那么下面说明既可以消除用户希望防止的说有偶发副作用:
*const volatile unsigned char * port=0x80;
*/
C++中的存储技术