c/c++运行期库包含一个堆栈检查函数,当编译源代码的时候,编译器在恰当的时候(这个在下面讲)生成对该函数的调用
下面我们看个函数
void SomeFunction()
{
int nValues[4000];
nValues[0]=0;
}
该函数需要16000个字节的堆栈空间,编译器生成的用于分配该堆栈空间的代码只是将堆栈指针递减16000个字节,但是在程序试图访问该内存之前,系统并不会将物理存储器分配给堆栈的较低区域
这里需要说明下,堆栈指针的初始地址是最高的,线程运行过程中,由于不断的分配内存,堆栈指针是下移的
这里附上堆栈结构的讲解篇
http://blog.csdn.net/baidu_25539425/article/details/78927326
由于物理存储器不会被提交给较低区域,所以,我们需要在适当的时候运行堆栈检查函数,那么什么时候是适当的呢
就是当我们需要的内存的数量大于CPU系统的页面大小的时候,就需要进行堆栈检查。当然这些全部是由系统完成的
以前我们讲过,intel系的CPU的页面大小为4KB,Alpaha系的CPU的页面大小为8KB,所以在windows系统下,只要函数所需的内存的数量大于4096个字节,系统就会自动调用堆栈检查函数
下面我们来展示一段堆栈检查函数的伪代码
#ifdef _M_ALPHA
#define PAGESIZE (8*1024)
#else
#define PAGESIZE (4*1024)
#endif
void StartCheck(int BytesNeedFromStack)
{
PBYTE pbStackPtr=(CPU's stack pointer);//获取堆栈指针的地址
while(BytesNeedFromStack>=PAGESIZE)
{
pbStackPtr-=PAGESIZE;//堆栈指针下移
pbStackPtr[0]=0;//给指针所在的页面分配物理存储器
BytesNeedFromStack-=PAGESIZE;
}
}
大家可能对pbStackPtr[0]=0这句话不太理解,我前面说过
但是在程序试图访问该内存之前,系统并不会将物理存储器分配给堆栈的较低区域
所以,这句话的意思是访问该内存,实际上,访问过后,系统就会把该页面提交到物理存储器