Гарантия непрерывной памяти с параметрами функции C ++

Аппель [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

Обновление: Я полагаю, что на этот вопрос есть ответ. Я думаю, что был неправ, когда основывал весь вопрос на непрерывном распределении памяти, когда то, что я искал (и о чем говорится в ссылке), является очевидным несоответствием между потребностью в параметрах, находящихся в памяти из-за использования адреса, в отличие от в реестрах из-за соглашений о вызовах, может быть, это вопрос другого дня.

Кто-то в Интернете ошибается, а иногда это я.

9
задан DuncanACoulter 29 March 2011 в 06:14
поделиться