Apache 运行库:Apache APR可移植运行库介绍(3)

思路方法
在像C/C这样中、高级语言中使用“约定”来介绍说明这两个问题常见约定有:__stdcall、__cdecl、__fastcall、thiscall和naked call
__stdcall约定:参数自右向左通过栈传递在返回前清理传送参数内存栈
__cdecl是C和C缺省方式都包含清空堆栈代码所以产生可执行文件大小会比_stdcall采用从右到左压栈方式注意:对于可变参数成员始终使用__cdecl转换方式
__fastcall约定规定通过寄存器来传送参数(实际上它用ECX和EDX传送前两个双字(DWORD)或更小参数剩下参数仍旧自右向左压栈传送在返回前清理传送参数内存栈)
thiscall仅仅应用于"C"成员this指针存放于CX寄存器参数从右到左压thiscall不是关键词因此不能被员指定
naked call采用上述约定时如果必要进入时编译器会产生代码来保存ESIEDIEBXEBP寄存器退出时则产生代码恢复这些寄存器内容naked call不产生这样代码naked call不是类型修饰符故必须和_declspec共同使用
另外区别约定对于内部修饰名处理思路方法也不所谓修饰名是C或者C在内部编译和链接时候产生标识名称
对于C语言而言__stdcall约定在输出名前加上个下划线前缀后面加上个"@"符号和其参数字节数格式为_functionname@number,例如 :function( a, b)其修饰名为:_function@8
__cdecl约定仅在输出名前加上个下划线前缀格式为_functionname
__fastcall约定在输出名前加上个"@"符号后面也是个"@"符号和其参数字节数格式为@functionname@number
如果是C区别约定处理要稍微复杂由于Apache是基于C语言开发因此本处不再描述
1.5.2.3内存池参数
有关最后个问题就是它参数如果内部需要分配空间那么你就可以看到参数参数中肯定包含个apr_pool_t参数比如:
APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m,const char *filename,apr_pool_t *pool);
由于Apache服务器所具有些特性APR中并没有使用普通malloc/free内存管理策略而是使用了自行设计内存池管理策略APR中所有需要内存都不再直接使用malloc分配然后首先分配块足够大内存块然后每次需要时候再从中获取;当内存不再使用时候也不是直接free而是直接归还给内存池只有当内存池本身被释放时候这些内存才真正被free给操作系统Apache中使用apr_pool_t描述个内存池因此毫无疑问由于这种特殊内存分配策略对于任何如果你需要使用内存那么你就应该指定内存所源自内存池这就是为什么大部分参数中都具有apr_pool_t原因有关内存池详细细节我们在第 2章详细讨论
有关作者
张中庆目前主要研究方向是嵌入式浏览器移动中间件以及大规模服务器设计目前正在进行Apache源代码分析计划出版Apache源代码全景分析上下册Apache系列文章为本书草案部分对Apache感兴趣朋友可以通过flydish1234 at sina.com.cn和的联系!



Tags:  .net运行库 vb运行库

延伸阅读

最新评论

发表评论