变量的4种存储类型
存储类用于定义C++程序中变量和函数的生命周期和可见性。
寿命是指变量保持活动的时间段,可见性是指可访问变量的程序的模块。
有五种类型的存储类,可以在C++程序中使用:
自动(Automatic)
寄存器(Register)
静态(Static)
外部(External)
可变(Mutable)
数据类型
- 数据类型: 如 int ,float 等。
- 存储类型: 总共有四种存储类型的变量,分别为自动变量(auto)、静态变量(static)、外部变量(extern)以及寄存器变量(register)
auto - 函数中所有的非静态局部变量。
auto是所有局部变量的默认存储类。
auto关键字自动应用于所有局部变量。
{ auto int v1; float v2 = 99.1; }
上面的例子定义了两个具有相同存储类的变量,auto只能在函数中使用。
register - 一般经常被使用的的变量(如某一变量需要计算几千次)可以设置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存中的非 register 变量。
寄存器变量在寄存器中分配存储器而不是RAM。 其大小与寄存器大小相同。 它比其他变量具有更快的访问速度。
建议仅使用寄存器变量进行快速访问!
ex:在计数器中。
register int count=0;
- 注意:不能得到寄存器变量的地址。
- static - 在变量前加上 static 关键字的变量,它只会定义一次,以后反复定义这个变量都是使用同一个。
静态变量只初始化一次,直到程序结束。
它保留可在多个函数之间调用的值。
静态变量由编译器提供的一个默认值:0。
void func() { static int v1=0; //static variable int v2=0; //local variable v1++; v2++; cout<<"v1=" << v1<<" v2=" <<v2<<endl; }
调用上面的func()会发现每次调用v1的值都会增加,而v2的值不会变。
extern - 把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。
extern变量对所有程序都可见。
如果两个或多个文件共享相同的变量或函数,则使用它。
extern int v1 = 0;
externDemo.cpp
#include<stdlib.h> int extern_value = 10;
main.cpp
#include<stdlib.h> #include<iostream> using namespace std; extern int extern_value; //从externDemo.cpp中取过来 static int p1 = 24;//全局静态变量 //寄存器变量 void register_demo() { register int j = 0; //不能在全局定义 printf("register_demo:j=%d ", j); //register可以不用再用,是C遗留下来的 //C++的register关键字已经优化,可以不用去申明 //如果我们打印它的地址,它就变成了普通的auto变量 printf("&j:0x%p\n", &j); } //静态局部变量量 void static_demo() { static int p2 = 23; int p3 = 23; p2++, p3++; //每次调用这个函数p2都会在上次的值的基础上加1,而p3只会等于24 printf("static_demo:p2=%d p3=%d\n", p2, p3); } //外部变量 void extern_demo() { extern_value++; printf("extern_demo:extern_value=%d\n", extern_value); } int main() { auto i = 0; //自动变量,自动定义为整数变量 register_demo(); static_demo(); static_demo(); static_demo(); extern_demo(); return 0; }
变量的作用域和生存周期