Appel [App02]非常简要地提到,当地址操作符应用于功能块内的形式参数之一时,C(并且可能是 C++)提供了关于实际参数在连续内存中的位置的保证,而不是寄存器。
例如
void foo(int a, int b, int c, int d)
{
int* p = &a;
for(int k = 0; k < 4; k++)
{
std::cout << *p << " ";
p++;
}
std::cout << std::endl;
}
和一个调用,如......
foo(1,2,3,4);
将产生以下输出“1 2 3 4”
我的问题是“这如何与调用约定交互?”
例如,GCC 上的 __fastcall 将尝试将前两个参数放在寄存器中,将其余参数放在堆栈中。这两个要求相互矛盾,有什么方法可以正式推断会发生什么,或者它是否受制于实现定义行为的反复无常的性质?
[App02] Java 中的现代编译器实现,Andrew w. 上诉,第 6 章,第 124 页
更新:我想这个问题已经回答了。我认为我将整个问题建立在连续内存分配上是错误的,因为我正在寻找(以及参考所说的)是由于使用 address-of 而在内存中的参数需求之间的明显不匹配,而不是由于调用约定而在寄存器中,也许这是另一天的问题。
互联网上的某个人是错误的,有时有人是我。