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"
Мой вопрос «Как это взаимодействует с соглашениями о вызовах?»
Например, __fastcall в GCC попытается поместить первые два аргумента в регистры, а остальные - в стек. Эти два требования противоречат друг другу, есть ли способ формально рассуждать о том, что произойдет, или это зависит от капризного характера поведения, определяемого реализацией?
[App02] Современная реализация компилятора на Java, Andrew w. Аппель, глава 6, стр. 124
Обновление: Я полагаю, что на этот вопрос дан ответ. Я думаю, что был неправ, когда основывал весь вопрос на непрерывном распределении памяти, когда то, что я искал (и о чем говорит ссылка) - это явное несоответствие между необходимостью сохранения параметров в памяти из-за использования адреса в отличие от регистров из-за соглашений о вызовах, может быть, это вопрос для другого дня.
Кто-то в Интернете не прав, а иногда это кто-то я.