为什么这个函数调用工作,即使我倒两个参数?

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)

请注意,我在函数调用中反转了nmaxftol参数.

令人惊讶的是,amoeba()仍然有效.在调试器中单步调试确认正确的值已分配给nmaxftol.

我的主例程#includeda头文件定义了amoeba()例程的签名,并且编译主例程没有产生任何错误.但是,amoeaba()源文件包含该标题(我的错误),因此编译器也没有生成任何错误.

那么为什么我的链接程序仍然可以正常运行,即使参数没有以正确的顺序给出?

UPDATE

@Binyamin Sharet,我在这里展示的组件调用之前的权利amoebaamoeba.它是否支持您的假设?

在致电<code> amoeba </ code>之前

在<code> amoeba </ code>里面

更新2

@Binyamin Sharet肯定,这是:

在此输入图像描述

MBy*_*ByD 6

原因可能是,因为浮点参数不是在堆栈上传递,而是在协处理器堆栈上传递,所以这两者的顺序无关紧要.

例如,函数需要这个参数顺序:

   |         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,这就是你的情况.

  • 不用说,但这只是偶然的:很可能,在不同的平台上,它不会起作用 (2认同)