在C
![](/icons/96256jiajia.gif)
中
![](/icons/96256dou.gif)
内存分成5个区
![](/icons/96256dou.gif)
他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区
![](/icons/96256dou2.gif)
栈
![](/icons/96256dou.gif)
就是那些由编译器在需要
![](/icons/96256de.gif)
时候分配
![](/icons/96256dou.gif)
在不需要
![](/icons/96256de.gif)
时候自动清楚
![](/icons/96256de.gif)
变量
![](/icons/96256de.gif)
存储区
![](/icons/96256dou2.gif)
里面
![](/icons/96256de.gif)
变量通常是局部变量、
![](/icons/96256hanshu.gif)
参数等
![](/icons/96256dou2.gif)
堆
![](/icons/96256dou.gif)
就是那些由
![](/icons/96256new.gif)
分配
![](/icons/96256de.gif)
内存块
![](/icons/96256dou.gif)
他们
![](/icons/96256de.gif)
释放编译器不去管
![](/icons/96256dou.gif)
由我们
![](/icons/96256de.gif)
应用
![](/icons/96256chengxu.gif)
去控制
![](/icons/96256dou.gif)
![](/icons/96256yi.gif)
般
![](/icons/96256yi.gif)
个
![](/icons/96256new.gif)
就要对应
![](/icons/96256yi.gif)
个delete
![](/icons/96256dou2.gif)
如果
![](/icons/96256chengxu.gif)
员没有释放掉
![](/icons/96256dou.gif)
那么在
![](/icons/96256chengxu.gif)
结束后
![](/icons/96256dou.gif)
操作系统会自动回收
![](/icons/96256dou2.gif)
自由存储区
![](/icons/96256dou.gif)
就是那些由malloc等分配
![](/icons/96256de.gif)
内存块
![](/icons/96256dou.gif)
他和堆是十分相似
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
不过它是用free来结束自己
![](/icons/96256de.gif)
生命
![](/icons/96256de.gif)
![](/icons/96256dou2.gif)
全局/静态存储区
![](/icons/96256dou.gif)
全局变量和静态变量被分配到同
![](/icons/96256yi.gif)
块内存中
![](/icons/96256dou.gif)
在以前
![](/icons/96256de.gif)
C语言中
![](/icons/96256dou.gif)
全局变量又分为
![](/icons/96256chushi.gif)
化
![](/icons/96256de.gif)
和未
![](/icons/96256chushi.gif)
化
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
在C
![](/icons/96256jiajia.gif)
里面没有这个区分了
![](/icons/96256dou.gif)
他们共同占用同
![](/icons/96256yi.gif)
块内存区
![](/icons/96256dou2.gif)
常量存储区
![](/icons/96256dou.gif)
这是
![](/icons/96256yi.gif)
块比较特殊
![](/icons/96256de.gif)
存储区
![](/icons/96256dou.gif)
他们里面存放
![](/icons/96256de.gif)
是常量
![](/icons/96256dou.gif)
不允许修改(当然
![](/icons/96256dou.gif)
你要通过非正当手段也可以修改
![](/icons/96256dou.gif)
而且思路方法很多)
明确区分堆和栈
在bbs上
![](/icons/96256dou.gif)
堆和栈
![](/icons/96256de.gif)
区分问题
![](/icons/96256dou.gif)
似乎是
![](/icons/96256yi.gif)
个永恒
![](/icons/96256de.gif)
话题
![](/icons/96256dou.gif)
由此可见
![](/icons/96256dou.gif)
初学者对此往往是混淆不清
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
所以我决定拿他第
![](/icons/96256yi.gif)
个开刀
![](/icons/96256dou2.gif)
首先
![](/icons/96256dou.gif)
我们举
![](/icons/96256yi.gif)
个例子:
void f
![](/icons/96256kh.gif)
{
![](/icons/96256int.gif)
* p=
![](/icons/96256int.gif)
[5]; }
这条短短
![](/icons/96256de.gif)
![](/icons/96256yi.gif)
句话就包含了堆和栈
![](/icons/96256dou.gif)
看到
![](/icons/96256new.gif)
![](/icons/96256dou.gif)
我们首先就应该想到
![](/icons/96256dou.gif)
我们分配了
![](/icons/96256yi.gif)
块堆内存
![](/icons/96256dou.gif)
那么指针p呢?他分配
![](/icons/96256de.gif)
是
![](/icons/96256yi.gif)
块栈内存
![](/icons/96256dou.gif)
所以这句话
![](/icons/96256de.gif)
意思就是: 在栈内存中存放了
![](/icons/96256yi.gif)
个指向
![](/icons/96256yi.gif)
块堆内存
![](/icons/96256de.gif)
指针p
![](/icons/96256dou2.gif)
在
![](/icons/96256chengxu.gif)
会先确定在堆中分配内存
![](/icons/96256de.gif)
大小
![](/icons/96256dou.gif)
然后
![](/icons/96256diaoyong.gif)
operator
![](/icons/96256new.gif)
分配内存
![](/icons/96256dou.gif)
然后返回这块内存
![](/icons/96256de.gif)
首地址
![](/icons/96256dou.gif)
放入栈中
![](/icons/96256dou.gif)
他在VC6下
![](/icons/96256de.gif)
汇编代码如下:
00401028 push 14h
0040102A call operator
![](/icons/96256new.gif)
(00401060)
0040102F add esp,4
00401032 mov dword ptr [ebp-8],eax
00401035 mov eax,dword ptr [ebp-8]
00401038 mov dword ptr [ebp-4],eax
这里
![](/icons/96256dou.gif)
我们为了简单并没有释放内存
![](/icons/96256dou.gif)
那么该如何去释放呢?是delete p么?澳
![](/icons/96256dou.gif)
错了
![](/icons/96256dou.gif)
应该是delete
![](/icons/96256zhk2.gif)
p
![](/icons/96256dou.gif)
这是为了告诉编译器:我删除
![](/icons/96256de.gif)
是
![](/icons/96256yi.gif)
个
![](/icons/96256shuzu.gif)
![](/icons/96256dou.gif)
VC6就会根据相应
![](/icons/96256de.gif)
Cookie信息去进行释放内存
![](/icons/96256de.gif)
工作
![](/icons/96256dou2.gif)
好了
![](/icons/96256dou.gif)
我们回到我们
![](/icons/96256de.gif)
主题:堆和栈究竟有什么区别?
主要
![](/icons/96256de.gif)
区别由以下几点:
1、管理方式区别;
2、空间大小区别;
3、能否产生碎片区别;
4、生长方向区别;
5、分配方式区别;
6、分配效率区别;
管理方式:对于栈来讲
![](/icons/96256dou.gif)
是由编译器自动管理
![](/icons/96256dou.gif)
无需我们手工控制;对于堆来说
![](/icons/96256dou.gif)
释放工作由
![](/icons/96256chengxu.gif)
员控制
![](/icons/96256dou.gif)
容易产生memory leak
![](/icons/96256dou2.gif)
[Page]
空间大小:
![](/icons/96256yi.gif)
般来讲在32位系统下
![](/icons/96256dou.gif)
堆内存可以达到4G
![](/icons/96256de.gif)
空间
![](/icons/96256dou.gif)
从这个角度来看堆内存几乎是没有什么限制
![](/icons/96256de.gif)
![](/icons/96256dou2.gif)
但是对于栈来讲
![](/icons/96256dou.gif)
![](/icons/96256yi.gif)
般都是有
![](/icons/96256yi.gif)
定
![](/icons/96256de.gif)
空间大小
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
例如
![](/icons/96256dou.gif)
在VC6下面
![](/icons/96256dou.gif)
默认
![](/icons/96256de.gif)
栈空间大小是1M(好像是
![](/icons/96256dou.gif)
记不清楚了)
![](/icons/96256dou2.gif)
当然
![](/icons/96256dou.gif)
我们可以修改:
打开工程
![](/icons/96256dou.gif)
依次操作菜单如下:Project->Setting->Link
![](/icons/96256dou.gif)
在Category 中选中Output
![](/icons/96256dou.gif)
然后在Reserve中设定堆栈
![](/icons/96256de.gif)
最大值和commit
![](/icons/96256dou2.gif)
注意:reserve最小值为4Byte;commit是保留在虚拟内存
![](/icons/96256de.gif)
页文件里面
![](/icons/96256dou.gif)
它设置
![](/icons/96256de.gif)
较大会使栈开辟较大
![](/icons/96256de.gif)
值
![](/icons/96256dou.gif)
可能增加内存
![](/icons/96256de.gif)
开销和启动时间
![](/icons/96256dou2.gif)
碎片问题:对于堆来讲
![](/icons/96256dou.gif)
频繁
![](/icons/96256de.gif)
![](/icons/96256new.gif)
/delete势必会造成内存空间
![](/icons/96256de.gif)
不连续
![](/icons/96256dou.gif)
从而造成大量
![](/icons/96256de.gif)
碎片
![](/icons/96256dou.gif)
使
![](/icons/96256chengxu.gif)
效率降低
![](/icons/96256dou2.gif)
对于栈来讲
![](/icons/96256dou.gif)
则不会存在这个问题
![](/icons/96256yinwei.gif)
栈是先进后出
![](/icons/96256de.gif)
队列
![](/icons/96256dou.gif)
他们是如此
![](/icons/96256de.gif)
![](/icons/96256yi.gif)
![](/icons/96256yi.gif)
对应
![](/icons/96256dou.gif)
以至于永远都不可能有
![](/icons/96256yi.gif)
个内存块从栈中间弹出
![](/icons/96256dou.gif)
在他弹出的前
![](/icons/96256dou.gif)
在他上面
![](/icons/96256de.gif)
后进
![](/icons/96256de.gif)
栈内容已经被弹出
![](/icons/96256dou.gif)
详细
![](/icons/96256de.gif)
可以参考数据结构
![](/icons/96256dou.gif)
这里我们就不再
![](/icons/96256yi.gif)
![](/icons/96256yi.gif)
讨论了
![](/icons/96256dou2.gif)
生长方向:对于堆来讲
![](/icons/96256dou.gif)
生长方向是向上
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
也就是向着内存地址增加
![](/icons/96256de.gif)
方向;对于栈来讲
![](/icons/96256dou.gif)
它
![](/icons/96256de.gif)
生长方向是向下
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
是向着内存地址减小
![](/icons/96256de.gif)
方向增长
![](/icons/96256dou2.gif)
分配方式:堆都是动态分配
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
没有静态分配
![](/icons/96256de.gif)
堆
![](/icons/96256dou2.gif)
栈有2种分配方式:静态分配和动态分配
![](/icons/96256dou2.gif)
静态分配是编译器完成
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
比如局部变量
![](/icons/96256de.gif)
分配
![](/icons/96256dou2.gif)
动态分配由alloca
![](/icons/96256hanshu.gif)
进行分配
![](/icons/96256dou.gif)
但是栈
![](/icons/96256de.gif)
动态分配和堆是区别
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
他
![](/icons/96256de.gif)
动态分配是由编译器进行释放
![](/icons/96256dou.gif)
无需我们手工实现
![](/icons/96256dou2.gif)
分配效率:栈是机器系统提供
![](/icons/96256de.gif)
数据结构
![](/icons/96256dou.gif)
计算机会在底层对栈提供支持:分配专门
![](/icons/96256de.gif)
寄存器存放栈
![](/icons/96256de.gif)
地址
![](/icons/96256dou.gif)
压栈出栈都有专门
![](/icons/96256de.gif)
指令执行
![](/icons/96256dou.gif)
这就决定了栈
![](/icons/96256de.gif)
效率比 较高
![](/icons/96256dou2.gif)
堆则是C/C
![](/icons/96256jiajia.gif)
![](/icons/96256hanshu.gif)
库提供
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
它
![](/icons/96256de.gif)
机制是很复杂
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
例如为了分配
![](/icons/96256yi.gif)
块内存
![](/icons/96256dou.gif)
库
![](/icons/96256hanshu.gif)
会按照
![](/icons/96256yi.gif)
定
![](/icons/96256de.gif)
算法(具体
![](/icons/96256de.gif)
算法可以参考数据结构/操作系统)在堆 内存中搜索可用
![](/icons/96256de.gif)
足够大小
![](/icons/96256de.gif)
空间
![](/icons/96256dou.gif)
如果没有足够大小
![](/icons/96256de.gif)
空间(可能是由于内存碎片太多)
![](/icons/96256dou.gif)
就有可能
![](/icons/96256diaoyong.gif)
系统功能去增加
![](/icons/96256chengxu.gif)
数据段
![](/icons/96256de.gif)
内存空间
![](/icons/96256dou.gif)
这样就有机会分 到足够大小
![](/icons/96256de.gif)
内存
![](/icons/96256dou.gif)
然后进行返回
![](/icons/96256dou2.gif)
显然
![](/icons/96256dou.gif)
堆
![](/icons/96256de.gif)
效率比栈要低得多
![](/icons/96256dou2.gif)
从这里我们可以看到
![](/icons/96256dou.gif)
堆和栈相比
![](/icons/96256dou.gif)
由于大量
![](/icons/96256new.gif)
/delete
![](/icons/96256de.gif)
使用
![](/icons/96256dou.gif)
容易造成大量
![](/icons/96256de.gif)
内存碎片;由于没有专门
![](/icons/96256de.gif)
系统支持
![](/icons/96256dou.gif)
效率很低;由于可能引发用户态 和核心态
![](/icons/96256de.gif)
切换
![](/icons/96256dou.gif)
内存
![](/icons/96256de.gif)
申请
![](/icons/96256dou.gif)
代价变得更加昂贵
![](/icons/96256dou2.gif)
所以栈在
![](/icons/96256chengxu.gif)
中是应用最广泛
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
就算是
![](/icons/96256hanshu.gif)
![](/icons/96256de.gif)
![](/icons/96256diaoyong.gif)
也利用栈去完成
![](/icons/96256dou.gif)
![](/icons/96256hanshu.gif)
![](/icons/96256diaoyong.gif)
过程中
![](/icons/96256de.gif)
参数
![](/icons/96256dou.gif)
返回地址
![](/icons/96256dou.gif)
EBP和局部变量都采用栈
![](/icons/96256de.gif)
方式存放
![](/icons/96256dou2.gif)
所以
![](/icons/96256dou.gif)
我们推荐大家尽量用栈
![](/icons/96256dou.gif)
而不是用堆
![](/icons/96256dou2.gif)
虽然栈有如此众多
![](/icons/96256de.gif)
好处
![](/icons/96256dou.gif)
但是由于和堆相比不是那么灵活
![](/icons/96256dou.gif)
有时候分配大量
![](/icons/96256de.gif)
内存空间
![](/icons/96256dou.gif)
还是用堆好
![](/icons/96256yi.gif)
些
无论是堆还是栈
![](/icons/96256dou.gif)
都要防止越界现象
![](/icons/96256de.gif)
发生(除非你是故意使其越界)
![](/icons/96256dou.gif)
![](/icons/96256yinwei.gif)
越界
![](/icons/96256de.gif)
结果要么是
![](/icons/96256chengxu.gif)
崩溃
![](/icons/96256dou.gif)
要么是摧毁
![](/icons/96256chengxu.gif)
![](/icons/96256de.gif)
堆、栈结构
![](/icons/96256dou.gif)
产生以想不到
![](/icons/96256de.gif)
结果,就 算是在你
![](/icons/96256de.gif)
![](/icons/96256chengxu.gif)
运行过程中
![](/icons/96256dou.gif)
没有发生上面
![](/icons/96256de.gif)
问题
![](/icons/96256dou.gif)
你还是要小心
![](/icons/96256dou.gif)
说不定什么时候就崩掉
![](/icons/96256dou.gif)
那时候debug可是相当困难
![](/icons/96256de.gif)
:)[Page]
对了
![](/icons/96256dou.gif)
还有
![](/icons/96256yi.gif)
件事
![](/icons/96256dou.gif)
如果有人把堆栈合起来说
![](/icons/96256dou.gif)
那它
![](/icons/96256de.gif)
意思是栈
![](/icons/96256dou.gif)
可不是堆
![](/icons/96256dou.gif)
呵呵
![](/icons/96256dou.gif)
清楚了?
用来控制变量
存储方式和可见性
![](/icons/96256hanshu.gif)
内部定义
![](/icons/96256de.gif)
变量
![](/icons/96256dou.gif)
在
![](/icons/96256chengxu.gif)
执行到它
![](/icons/96256de.gif)
定义处时
![](/icons/96256dou.gif)
编译器为它在栈上分配空间
![](/icons/96256dou.gif)
![](/icons/96256hanshu.gif)
在栈上分配
![](/icons/96256de.gif)
空间在此
![](/icons/96256hanshu.gif)
执行结束时会释放掉
![](/icons/96256dou.gif)
这样就产生了
![](/icons/96256yi.gif)
个问题: 如果想将
![](/icons/96256hanshu.gif)
中此变量
![](/icons/96256de.gif)
值保存至下
![](/icons/96256yi.gif)
次
![](/icons/96256diaoyong.gif)
时
![](/icons/96256dou.gif)
如何实现? 最容易想到
![](/icons/96256de.gif)
思路方法是定义
![](/icons/96256yi.gif)
个全局
![](/icons/96256de.gif)
变量
![](/icons/96256dou.gif)
但定义为
![](/icons/96256yi.gif)
个全局变量有许多缺点
![](/icons/96256dou.gif)
最明显
![](/icons/96256de.gif)
缺点是破坏了此变量
![](/icons/96256de.gif)
访问范围(使得在此
![](/icons/96256hanshu.gif)
中定义
![](/icons/96256de.gif)
变量
![](/icons/96256dou.gif)
不仅仅受此
![](/icons/96256hanshu.gif)
控制)
![](/icons/96256dou2.gif)
需要
![](/icons/96256yi.gif)
个数据对象为整个类而非某个对象服务,同时又力求不破坏类
![](/icons/96256de.gif)
封装性,即要求此成员隐藏在类
![](/icons/96256de.gif)
内部
![](/icons/96256dou.gif)
对外不可见
![](/icons/96256static.gif)
![](/icons/96256de.gif)
内部机制:
静态数据成员要在
![](/icons/96256chengxu.gif)
![](/icons/96256yi.gif)
开始运行时就必须存在
![](/icons/96256dou2.gif)
![](/icons/96256yinwei.gif)
![](/icons/96256hanshu.gif)
在
![](/icons/96256chengxu.gif)
运行中被
![](/icons/96256diaoyong.gif)
![](/icons/96256dou.gif)
所以静态数据成员不能在任何
![](/icons/96256hanshu.gif)
内分配空间和
![](/icons/96256chushi.gif)
化
![](/icons/96256dou2.gif)
这样
![](/icons/96256dou.gif)
它
![](/icons/96256de.gif)
空间分配有 3个可能
![](/icons/96256de.gif)
地方
![](/icons/96256dou.gif)
![](/icons/96256yi.gif)
是作为类
![](/icons/96256de.gif)
外部接口
![](/icons/96256de.gif)
头文件
![](/icons/96256dou.gif)
那里有类声明; 2是类定义
![](/icons/96256de.gif)
内部实现
![](/icons/96256dou.gif)
那里有类
![](/icons/96256de.gif)
成员
![](/icons/96256hanshu.gif)
定义; 3是应用
![](/icons/96256chengxu.gif)
![](/icons/96256de.gif)
![](/icons/96256main.gif)
()
![](/icons/96256hanshu.gif)
前
![](/icons/96256de.gif)
全局数据声明和定义处
![](/icons/96256dou2.gif)
静态数据成员要实际地分配空间
![](/icons/96256dou.gif)
故不能在类
![](/icons/96256de.gif)
声明中定义(只能声明数据成员)
![](/icons/96256dou2.gif)
类声明只声明
![](/icons/96256yi.gif)
个类
![](/icons/96256de.gif)
“尺寸和规格”
![](/icons/96256dou.gif)
并不进行实际
![](/icons/96256de.gif)
内存分配
![](/icons/96256dou.gif)
所以在类声 明中写成定义是
![](/icons/96256cuowu.gif)
![](/icons/96256de.gif)
![](/icons/96256dou2.gif)
它也不能在头文件中类声明
![](/icons/96256de.gif)
外部定义
![](/icons/96256dou.gif)
![](/icons/96256yinwei.gif)
那会造成在多个使用该类
![](/icons/96256de.gif)
源文件中
![](/icons/96256dou.gif)
对其重复定义
![](/icons/96256static.gif)
被引入以告知编译器
![](/icons/96256dou.gif)
将变量存储在
![](/icons/96256chengxu.gif)
![](/icons/96256de.gif)
静态存储区而非栈上空间
![](/icons/96256dou.gif)
静态
数据成员按定义出现
![](/icons/96256de.gif)
先后顺序依次
![](/icons/96256chushi.gif)
化
![](/icons/96256dou.gif)
注意静态成员嵌套时
![](/icons/96256dou.gif)
要保证所嵌套
![](/icons/96256de.gif)
成员已经
![](/icons/96256chushi.gif)
化了
![](/icons/96256dou2.gif)
消除时
![](/icons/96256de.gif)
顺序是
![](/icons/96256chushi.gif)
化
![](/icons/96256de.gif)
反顺序
![](/icons/96256static.gif)
![](/icons/96256de.gif)
优势:
可以节省内存
![](/icons/96256dou.gif)
![](/icons/96256yinwei.gif)
它是所有对象所公有
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
因此
![](/icons/96256dou.gif)
对多个对象来说
![](/icons/96256dou.gif)
静态数据成员只存储
![](/icons/96256yi.gif)
处
![](/icons/96256dou.gif)
供所有对象共用
![](/icons/96256dou2.gif)
静态数据成员
![](/icons/96256de.gif)
值对每个对象都是
![](/icons/96256yi.gif)
样
![](/icons/96256dou.gif)
但它
![](/icons/96256de.gif)
值是可以更新
![](/icons/96256de.gif)
![](/icons/96256dou2.gif)
只要对静态数据成员
![](/icons/96256de.gif)
值更新
![](/icons/96256yi.gif)
次
![](/icons/96256dou.gif)
保证所有对象存取更新后
![](/icons/96256de.gif)
相同
![](/icons/96256de.gif)
值
![](/icons/96256dou.gif)
这样可以提高时间效率
![](/icons/96256dou2.gif)
引用静态数据成员时
![](/icons/96256dou.gif)
采用如下格式:
<类名>::<静态成员名>
如果静态数据成员
![](/icons/96256de.gif)
访问权限允许
![](/icons/96256de.gif)
话(即public
![](/icons/96256de.gif)
成员)
![](/icons/96256dou.gif)
可在
![](/icons/96256chengxu.gif)
中
![](/icons/96256dou.gif)
按上述格式
来引用静态数据成员
![](/icons/96256dou2.gif)
PS:
(1)类
![](/icons/96256de.gif)
静态成员
![](/icons/96256hanshu.gif)
是属于整个类而非类
![](/icons/96256de.gif)
对象
![](/icons/96256dou.gif)
所以它没有this指针
![](/icons/96256dou.gif)
这就导致
了它仅能访问类
![](/icons/96256de.gif)
静态数据和静态成员
![](/icons/96256hanshu.gif)
![](/icons/96256dou2.gif)
(2)不能将静态成员
![](/icons/96256hanshu.gif)
定义为虚
![](/icons/96256hanshu.gif)
![](/icons/96256dou2.gif)
(3)由于静态成员声明于类中
![](/icons/96256dou.gif)
操作于其外
![](/icons/96256dou.gif)
所以对其取地址操作
![](/icons/96256dou.gif)
就多少有些特殊[Page]
![](/icons/96256dou.gif)
变量地址是指向其数据类型
![](/icons/96256de.gif)
指针
![](/icons/96256dou.gif)
![](/icons/96256hanshu.gif)
地址类型是
![](/icons/96256yi.gif)
个“nonmember
![](/icons/96256hanshu.gif)
指针”
![](/icons/96256dou2.gif)
(4)由于静态成员
![](/icons/96256hanshu.gif)
没有this指针
![](/icons/96256dou.gif)
所以就差不多等同于nonmember
![](/icons/96256hanshu.gif)
![](/icons/96256dou.gif)
结果就
产生了
![](/icons/96256yi.gif)
个意想不到
![](/icons/96256de.gif)
好处:成为
![](/icons/96256yi.gif)
个callback
![](/icons/96256hanshu.gif)
![](/icons/96256dou.gif)
使得我们得以将C
![](/icons/96256jiajia.gif)
和C-based X W
indow系统结合
![](/icons/96256dou.gif)
同时也成功
![](/icons/96256de.gif)
应用于线程
![](/icons/96256hanshu.gif)
身上
![](/icons/96256dou2.gif)
(5)
![](/icons/96256static.gif)
并没有增加
![](/icons/96256chengxu.gif)
![](/icons/96256de.gif)
时空开销
![](/icons/96256dou.gif)
相反她还缩短了子类对父类静态成员
![](/icons/96256de.gif)
访问
时间
![](/icons/96256dou.gif)
节省了子类
![](/icons/96256de.gif)
内存空间
![](/icons/96256dou2.gif)
(6)静态数据成员在<定义或介绍说明>时前面加关键字
![](/icons/96256static.gif)
![](/icons/96256dou2.gif)
(7)静态数据成员是静态存储
![](/icons/96256de.gif)
![](/icons/96256dou.gif)
所以必须对它进行
![](/icons/96256chushi.gif)
化
![](/icons/96256dou2.gif)
(8)静态成员
![](/icons/96256chushi.gif)
化和
![](/icons/96256yi.gif)
般数据成员
![](/icons/96256chushi.gif)
化区别:
![](/icons/96256chushi.gif)
化在类体外进行
![](/icons/96256dou.gif)
而前面不加
![](/icons/96256static.gif)
![](/icons/96256dou.gif)
以免和
![](/icons/96256yi.gif)
般静态变量或对象相混淆;
![](/icons/96256chushi.gif)
化时不加该成员
![](/icons/96256de.gif)
访问权限控制符private
![](/icons/96256dou.gif)
public等;
![](/icons/96256chushi.gif)
化时使用作用域运算符来标明它所属类;
所以我们得出静态数据成员
![](/icons/96256chushi.gif)
化
![](/icons/96256de.gif)
格式:
<数据类型><类名>::<静态数据成员名>=<值>
(9)为了防止父类
![](/icons/96256de.gif)
影响
![](/icons/96256dou.gif)
可以在子类定义
![](/icons/96256yi.gif)
个和父类相同
![](/icons/96256de.gif)
静态变量
![](/icons/96256dou.gif)
以屏蔽父类
![](/icons/96256de.gif)
影响
![](/icons/96256dou2.gif)
这里有
![](/icons/96256yi.gif)
点需要注意:我们说静态成员为父类和子类共享
![](/icons/96256dou.gif)
但我们有 重复定义了静态成员
![](/icons/96256dou.gif)
这会不会引起
![](/icons/96256cuowu.gif)
呢?不会
![](/icons/96256dou.gif)
我们
![](/icons/96256de.gif)
编译器采用了
![](/icons/96256yi.gif)
种绝妙
![](/icons/96256de.gif)
手法:name-mangling 用以生成唯
![](/icons/96256yi.gif)
![](/icons/96256de.gif)
标志