Аппель [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 попытается поместить первые два аргумента в регистры, а остаток в стек. Эти два требования противоречат друг другу, есть ли способ формально рассуждать о том, что произойдет, или это зависит от капризного характера поведения, определенного реализацией?
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 попытается поместить первые два аргумента в регистры, а остаток в стек. Эти два требования противоречат друг другу, есть ли способ формально рассуждать о том, что произойдет, или это зависит от капризного характера поведения, определенного реализацией?
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, Эндрю В. Appel, Глава 6, страница 124
Обновление: Я полагаю, что на этот вопрос есть ответ. Я думаю, что был неправ, когда основывал весь вопрос на непрерывном распределении памяти, когда то, что я искал (и о чем говорится в ссылке), является очевидным несоответствием между потребностью в параметрах, находящихся в памяти из-за использования адреса, в отличие от в реестрах из-за соглашений о вызовах, может быть, это вопрос другого дня.
Кто-то в Интернете ошибается, а иногда это я.