Что происходит со стеком, когда я объявляю ссылочную переменную? Переполнение стека

Когда я объявляю переменную, она будет размещена в стеке с определенным индексом памяти, верно?

Но когда я объявляю ссылочную переменную, она будет указывать на тот же индекс другого, так что в стеке не должно быть нового места …

Как c ++ справляется с этой ситуацией?

Я имею в виду практически, у него есть таблица, которая содержит связь между именами и индексами?

Компилятор делает всю работу?

Я надеюсь, что будет ясно … Если у кого-нибудь есть какие-то руководства или материалы по этому поводу, я буду очень рад!

Спасибо всем и извините, если я написал на плохом английском!

1

Решение

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

1

Другие решения

В типичной реализации распределение переменной зависит от того, как вы объявляете ее и где вы ее объявляете.

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

Переменные, определенные внутри функции, которые не являются static может быть размещен в стеке. Они могут быть помещены в регистры, а не в стек. Зависит от компилятора и настроек оптимизации. Переменные могут быть «оптимизированы» и не существовать в конечном исполняемом файле.

Многие компиляторы обрабатывают ссылки как указатели. Поэтому, когда вы передаете переменную по ссылке, компилятор может передавать по указателю.

1

C ++ 14 [dcl.ref] / 4 говорит:

Не указано, требуется ли ссылка для хранения

Для ситуации, как int a; int &b = a; компилятор действительно может просто хранить два идентификатора, которые во время компиляции ссылаются на один и тот же адрес в своей таблице идентификаторов. Вероятно, здесь не требуется никакого дополнительного хранилища. Действительно, правила C ++ говорят, что int b; int &a = b; приводит к точно такой же ситуации.

Когда функция принимает параметр по ссылке: если компилятор не смог оптимизировать вызов функции, то, вероятно, будет передан адрес.

0