C语言中extern、register、static、auto的区别:
变量和函数的属性包括数据类型和数据的存储类别,
存储类别是指数据在内存中的存储方式(包括静态和动态)包含static,register,extern,auto.
内存中简单来说分为三块:静态区,堆区,栈区。外部变量和全局变量放在静态区,局部变量和函数的参数放在栈区,mallo函数开辟的动态内存放在堆区。
1.extern
是外部变量声明,是指这是一个已在别的地方定义过的对象,这里只是对变量的一次重复引用,不会产生新的变量。
2.static 静态数据
数据存放在全局数据区,但作用域只是本文件/本函数中,所以你可以在两个不同的文件或者函数内部声明同名的static变量,但是他们是两个不同的全局变量。如果定义在函数内,那么该对象具有无链接,函数外不能对其访问。如果定义在函数外,那么该对象具有内部链接,其他程序文件不能对其访问。
3.auto 普通局部栈变量
是自动存储,这种对象会自动创建和销毁,建议这个变量要放在栈上面,调用函数时分配内存,函数结束时释放内存。
4.register 寄存器变量
请求编译器将这个变量保存在CPU的寄存器中,从而加快程序的运行。系统的寄存器是有限制的,声明变量时,如 register int i;这种存储类型可以用于频繁使用的变量。
注意点:1.auto存储类型的变量只能在某个程序范围内使用,它采用堆栈的方式分配内存空间。
2.全局变量声明不允许为auto变量,register不适用于全局变量。
3.register是不能取地址的,比如 int i;(自动为auto变量),可以定义指针变量int *p=&i; 但是register int j; int *p=&j;是错误的。因为无法对寄存器定址。
4. 声明变量为register,编译器不一定将它处理为寄存器变量,毕竟资源是有限的。
5.实际上现在一般的编译器都忽略auto和register的声明,现在的编译器自己能够区分将哪些变量放在寄存器中,哪些变量放置在堆栈中;甚至将一些变量有时存放在堆栈有时存放在寄存器中。