还有人要问我static关键字吗?
更多文章欢迎关注个人微信公众号:极客熊猫
程序的内存布局
聊static关键字之前,先要复习一下一个进程的内存布局。
kernel space |
---|
stack ↓ |
unused |
dynamic libraries |
unused |
heap ↑ |
read/write sections(.data .bss) |
readonly sections(.init .rodata .text) |
reserved |
其中,stack向低地址增长,heap向高地址增长。
对于32位的Linux系统,kernel space占1GB(0xc0000000~0xffffffff),剩下的用户空间占3GB。
.text段:编译后产生的机器代码
.data段:已初始化的全局变量和局部静态变量。
.bss段:未初始化的全局变量和局部静态变量。
未初始化 的全局变量和局部静态变量默认值都为0,本来也可以放在.data段,但是为它们在.data段分配空间并存放0是没有必要的。但可执行文件又必须记录未初始化的全局变量和局部静态变量的大小总和,所以.bss段只是为它们预留位置而已,并没有内容,在文件中也不占据空间。
static关键字
面向过程程序设计的static
静态局部变量
分配在静态存储区, 在程序整个运行期间都不释放。
静态全局变量
该变量在全局数据区分配内存。
静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。
静态函数
静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。
面向对象程序设计的static
静态数据成员
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。
静态成员函数
与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。