Компилятор Baremetal (arm-none-eabi) - реализация компилятора - PullRequest
0 голосов
/ 22 марта 2019

Обычная практика - объявлять переменные стека (переменные, расположенные в стеке, а не динамически или статически) в точке входа функции, а не смешанные с инструкциями внутри функции. Смотрите пример 1.a и 1.b. Это помогает улучшить читабельность и даже требовало использования более старого языка.

В современных C / C ++ это больше не требуется (но все же хорошая практика).

Мой вопрос, хотя: Как компилятор решает эту проблему, если переменные стека находятся внутри функции, а не в точке входа. Посмотрите примеры 2.a и 2.b, как я могу представить, что он решает это. Что на самом деле происходит?

1.a) Пример (Общая практика / Лучшая практика)

void main()
{
    int a = 3;      // best practice
    bool c = false; // best practice

    a += 16;

    if(a == 5)
    {
        c=false;
    }
}

... а не ...

1.b) Пример (необычный)

void main()
{
    int a = 3;
    a += 16;

    bool c = false; // variable after some instructions executed..
    if(a == 5)
    {
        c=false;
    }
}

2.a) Возможное решение компилятора (A)

void main()
{
    int a = 3;
    a += 16;

    bool c = false; // COMPILER CUTS THIS LINE AND MOVES IT UP UNDER "int a = 3;"
    if(a == 5)
    {
        c=false;
    }
}

2.B) Возможное решение компилятора (B)

void main()
{
    int a = 3;
    a += 16;

    { // COMPILER ADDS SUBSECTION IN ORDER TO INTRODUCE NEW VARIABLES ON STACK
        bool c = false; 
        if(a == 5)
        {
            c=false;
        }
    }
}

1 Ответ

2 голосов
/ 22 марта 2019

Когда, как и где компилятор создает или выделяет такие переменные, полностью зависит от реализации. Он может создать кадр стека для всех переменных в начале функции, или может расширить кадр стека в точке объявления, или он может вообще не использовать стек и использовать хранилище регистров.

Язык требует только правильной семантики; что переменная не является в области действия (т. е. на нее нельзя ссылаться кодом) до ее объявления, и что область действия заканчивается после закрытия } блока, в котором она была объявлена.

...