Appel [App02]は、アドレス演算子が関数ブロック内の仮パラメーターの1つに適用される場合、レジスターではなく、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);
次の出力「1234」が生成されます
私の質問は、「これは呼び出し規約とどのように相互作用するのですか?」です。
たとえば、GCCの__fastcallは、最初の2つの引数をレジスタに配置し、残りをスタックに配置しようとします。2つの要件は互いに対立していますが、何が起こるかについて正式に推論する方法はありますか、それとも実装で定義された動作の気まぐれな性質の影響を受けますか?
[App02] Javaでの最新のコンパイラ実装、Andreww。Appel、第6章、124ページ
更新:この質問は答えられたと思います。私が探していたもの(および参照が話しているもの)が、address-ofの使用によるメモリ内のパラメータの必要性の間の明らかな不一致である場合、呼び出し規約によるレジスターでは、おそらくそれは別の日の質問です。
インターネット上の誰かが間違っていて、時々誰かが私であるということです。