阅读:942回复:2
一个费解的问题!
我用c++和fortran混合编程,发现同一个函数,有时fortran要快的多,
我后来发觉是C++编译器在被调用函数的开头且处理完ESP,EBP侯家了这么一段: *********************************************************** 137: void Deriv_OI(double dX[6],double dF[],CClstOITab* cTab) 138: { 004017D0 55 push ebp 004017D1 8B EC mov ebp,esp 004017D3 B8 FC DB 00 00 mov eax,0DBFCh 004017D8 E8 53 CB 00 00 call $$$00001 (0040e330) 004017DD 53 push ebx 004017DE 56 push esi 004017DF 57 push edi 004017E0 8D BD 04 24 FF FF lea edi,[ebp-0DBFCh] 004017E6 B9 FF 36 00 00 mov ecx,36FFh 004017EB B8 CC CC CC CC mov eax,0CCCCCCCCh 004017F0 F3 AB rep stos dword ptr [edi] *********************************************************** 从斜体部分(004017E0)开始,可以看出,这是一个很大的循环,而对比fortran代码,就没有这个操作, *********************************************************** 3: SUBROUTINE DERIV2_OI[C](T,X,F,PV) 0045C630 55 push ebp 0045C631 8B EC mov ebp,esp 0045C633 83 EC 4C sub esp,4Ch 0045C636 53 push ebx 0045C637 56 push esi 0045C638 57 push edi *********************************************************** 而且每个c++函数都有这个,我觉得是对堆栈的其余部分进行某种操作 到底是在干什么呢?为什么这么做?另外那个call $$$00001又是做什么?好象是pageprobe什么的. 希望那个老大能给解答! |
|
沙发#
发布于:2002-08-05 14:15
关键是为什么要循环赋值36FFh次?
004017E6 B9 FF 36 00 00 mov ecx,36FFh 004017EB B8 CC CC CC CC mov eax,0CCCCCCCCh 004017F0 F3 AB rep stos dword ptr [edi] 并没有那么多局部变量啊?而且这好像并不是初始化 局部变量: 004017E0 8D BD 04 24 FF FF lea edi,[ebp-0DBFCh] 而是初始化其他堆栈空间. |
|
板凳#
发布于:2002-08-05 13:10
这是DEBUG版本吧!编译器产生这些代码可以方便调试,你可以看一下,在DEBUG版本下,所有未赋值的局部变量的初始值都是0CCCCCCCC,但是RELEASE版本就没有这些代码了,因为它已经做了优化。
|
|