c/c++堆栈检查函数详解

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这句话不太理解,我前面说过
但是在程序试图访问该内存之前,系统并不会将物理存储器分配给堆栈的较低区域
所以,这句话的意思是访问该内存,实际上,访问过后,系统就会把该页面提交到物理存储器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章