lin*_*lof 4 c compiler-construction linker
我正在研究Numerical Recipes中 Nelder-Mead算法的一种变体,它允许用户指定要进行的最大目标函数调用次数.
从我的主程序,这里是我如何调用amoeba()实现Nelder-Mead算法的函数:
amoeba(p,y,params->ndim,params->tol,params->nmax,internal_funk,&nfunc);
Run Code Online (Sandbox Code Playgroud)
但这是如何实现的:
void amoeba(float **p, float y[], int ndim, unsigned nmax, float ftol, float (*funk)(float []), int *nfunk) {
....
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在函数调用中反转了nmax和ftol参数.
令人惊讶的是,amoeba()仍然有效.在调试器中单步调试确认正确的值已分配给nmax和ftol.
我的主例程#includeda头文件定义了amoeba()例程的签名,并且编译主例程没有产生任何错误.但是,amoeaba()源文件不包含该标题(我的错误),因此编译器也没有生成任何错误.
那么为什么我的链接程序仍然可以正常运行,即使参数没有以正确的顺序给出?
UPDATE
@Binyamin Sharet,我在这里展示的组件调用之前的权利amoeba和amoeba.它是否支持您的假设?


更新2
@Binyamin Sharet肯定,这是:

原因可能是,因为浮点参数不是在堆栈上传递,而是在协处理器堆栈上传递,所以这两者的顺序无关紧要.
例如,函数需要这个参数顺序:
| p | |
| y | |
| ndim | |
| nmax | |
| funk | |
| nfunk | ftol |
+------------------------+-----------------------------+
| stack | coprocessor stack |
Run Code Online (Sandbox Code Playgroud)
如果切换这并不重要,nmax并且ftol,因为在堆栈中的顺序将是相同的,而当amoeba试图阅读,它不会为同样的原因感到困惑.
编辑
读取反汇编显示我有点失误,但由于SSE,用于传递float变量的指令是movss,你可以在你添加的assemblt列表中看到,一次xmm0注册(在调用者中),和来自xmm0(被叫者)的时间.所以你可以用xmm寄存器替换单词coprocessor-stack,这就是你的情况.