Повторно ли используется смещение стека, назначенное локальным переменным стека, например, в случае, если оно становится мертвым или выходит из области видимости? - PullRequest
0 голосов
/ 09 октября 2018

Другими словами, будут ли компиляторы выделять достаточно места в программном стеке для хранения всех переменных на самом глубоком уровне вложенности блоков в текущей функции или они также смотрят на живучесть и объем переменных?

void zoo(int num) {
    if (num) {
        int a = foo();
        bar(a);
    } else {
        int b = foo();
        bar(b);
    }
}

Например, приведенному выше коду будут назначены разные смещения в стеке для a и b, даже если бы им было назначено только одно смещение (например, rbp - 8), это также было бы допустимо.Мой вопрос заключается в том, будут ли компиляторы, такие как gcc и clang, когда-либо выводить сборку, где нескольким переменным назначается одно и то же статическое смещение?

Есть ли что-нибудь в спецификациях по этому поводу?

Я хочу знать, существует ли уникальное отображение между исходными переменными и смещениями стека, присутствующими в скомпилированном файле сборки.

1 Ответ

0 голосов
/ 09 октября 2018

Как правило, не существует уникального сопоставления между объектами с автоматической продолжительностью хранения («локальными» объектами, определенными внутри функции или блока) и смещениями стека.Я видел, как сгенерированный компилятором код повторно использует одно и то же расположение стека для разных объектов, либо потому, что использование одного не перекрывало использование другого в коде C, либо потому, что компилятор перемещал его в регистр для любых целей и больше ненеобходимо использовать для этого расположение стека.

Стандарты C и C ++ не требуют реализаций для реализации своего распределения в стеке каким-либо конкретным способом.Они могут свободно использовать места в стеке.Они также могут свободно выделять все пространство стека, которое может потребоваться 1 или ждать, чтобы увидеть, введены ли конкретные блоки или нет, прежде чем дополнительно выделять пространство стека для объектов внутри этих блоков.

Примечание

1 Реализации, которые поддерживают массивы переменной длины, обычно должны ждать, пока размер массива не может быть определен, прежде чем выделять для него место.

...