Когда я объявляю переменную, она будет размещена в стеке с определенным индексом памяти, верно?
Но когда я объявляю ссылочную переменную, она будет указывать на тот же индекс другого, так что в стеке не должно быть нового места …
Как c ++ справляется с этой ситуацией?
Я имею в виду практически, у него есть таблица, которая содержит связь между именами и индексами?
Компилятор делает всю работу?
Я надеюсь, что будет ясно … Если у кого-нибудь есть какие-то руководства или материалы по этому поводу, я буду очень рад!
Спасибо всем и извините, если я написал на плохом английском!
Стандарт C ++ не определяет ABI, так что это определяется реализацией. Но обычный подход заключается в том, что ссылка реализована в виде указателя, поэтому указатель размещается в стеке. Однако, если эта ссылка нигде не передана, она может быть оптимизирована и просто заменена переменной, на которую она указывает.
В типичной реализации распределение переменной зависит от того, как вы объявляете ее и где вы ее объявляете.
Обычно переменные, определенные вне функции, помещаются в одну область памяти (ни в стек, ни в кучу). Константы могут быть размещены в другой области или в исполняемом файле.
Переменные, определенные внутри функции, которые не являются static
может быть размещен в стеке. Они могут быть помещены в регистры, а не в стек. Зависит от компилятора и настроек оптимизации. Переменные могут быть «оптимизированы» и не существовать в конечном исполняемом файле.
Многие компиляторы обрабатывают ссылки как указатели. Поэтому, когда вы передаете переменную по ссылке, компилятор может передавать по указателю.
C ++ 14 [dcl.ref] / 4 говорит:
Не указано, требуется ли ссылка для хранения
Для ситуации, как int a; int &b = a;
компилятор действительно может просто хранить два идентификатора, которые во время компиляции ссылаются на один и тот же адрес в своей таблице идентификаторов. Вероятно, здесь не требуется никакого дополнительного хранилища. Действительно, правила C ++ говорят, что int b; int &a = b;
приводит к точно такой же ситуации.
Когда функция принимает параметр по ссылке: если компилятор не смог оптимизировать вызов функции, то, вероятно, будет передан адрес.