变量属性使用到的几个关键字
auto static register extern const volatile
auto:这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量,最常用,因为所有变量默认为就是auto类型的
static:这个关键词可以使变量变得老实,只有当程序改变这个变量的时候,这个变量才可以改变。而且只初始化一次。
详细说明如下:变量会被放在程序的全局存储区中(下次调用不改变原来的值),这点是和堆栈变量的区别;还有就是会限制变量的使用范围(当前文件内使用)和extern互斥。
register:使变量存放在CPU内部的寄存器当中,主要用于提高效率(所申请的变量必须是CPU寄存器可以接受 的值,不可以通过&获得寄存器地址)
extern :意为“外来的”,它的作用就是告诉编译器有这个变量,可能不在当前这个目录需要自己去找,但一定是存在的。还有一个作用就是告诉编译器按照c语言的方式进行编译如: extern “c”{ 所要编译的内容};
const:被const修饰的东西受到强制保护,可以防止以外的变动,提高程序的健壮性,可以修饰函数的参数、返回值、甚至函数的定义体。
修饰输入参数:a.对于非内部数据类型的输入参数,应将“值传递”的方式改为“const引用传递 ”,这样可以提高效率如:void Func(A a )改为void Func(const A &a)b.对于内部的数据类型就不要这样(效率不高,可读性不强)
修饰返回值:如果给以“指针传递方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。 (如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。)
如对于: const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();//cannot convert from 'const char *' to 'char *';
正确的用法是:
const char *str = GetString();
volatile :表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。