auto 存储类(Storage Class)
auto是c++11以后的新特性,编译器可以自行推导数据类型
,这一切都是编译器的功劳
auto PI = 3.14; //double
auto msg("hello"); // const char*
auto val = new auto(9); // int*
auto x1 = 5, x2 = 5.0, x3 = 'r'; // 错误,必须初始化为同一类型
register 存储类
- register 定义存储在寄存器而不是内存中的局部变量(但也仅仅是)希望而已,是否会实现,取决于编译器最终的判断和抉择。
- Best Practice:主要是为了性能优化。注意,不要过早优化。
- 不要因为C++可以做什么就做什么!
register int res;
各个存储器速度快慢排序:
register > cache > memory > disk > network
static 存储类
- 指示编译器在程序的声明周期内保持局部变量的存在,而不需要在每次它进入或离开作用域时进行创建或销毁
- 使用static修饰局部变量可以在函数调用之间保持局部变量的值
- static修饰符也可以用于全局变量。当static修饰全局变量时,会使变量的作用域限制在声明它的文件内(C语言的遗传)。
其实这也很好理解, 想想它的内存意义即可明白。对比Java用static修饰的成员属性和成员方法,则这些属性或方法就变成类成员属性、类成员方法,在程序运行时,全局只有一份,并一直存在。
extern 存储类
extern 存储类告诉编译器这个变量在别的地方被定义了
编译最后的一步链接的时候可以找到
// a.cpp
int count;
extern void write_extern();
int main()
{
count = 5;
write_extern();
}
// b.cpp
extern int count;
void write_extern()
{
std::cout << "Count is " << count << std::endl;
}