Теоретически, ответ "это зависит от реализации" . Каждый компилятор C выбирает лучший подход - пока он демонстрирует правильное поведение, не имеет значения, как вы туда попали.
На практике, вы, вероятно, не увидите ссылку на имена переменных в скомпилированной программе . Это потому, что процессору не нужно знать или заботиться о именах переменных, которые вы назначили для выполнения вашей программы. Он работает на гораздо более низком уровне: ему просто нужно понять, какие инструкции выполнять и в каком порядке. Следовательно, включение этой информации является излишней расточительностью, которая просто приведет к увеличению размера вашей программы.
Есть три основных случая, которые я перечислю ниже. Я также опишу поведение того, что, вероятно, будет делать типичный компилятор, хотя помните, что он зависит от реализации, и в общем случае компиляторам разрешено делать все, что они хотят, при условии, что они демонстрируют правильное стандартное поведение.
Для локальных переменных, как часть процесса компиляции, компилятор заменяет имя каждой переменной (например, «int foo;») ссылкой на соответствующую память, выделенную для этой переменной («адрес памяти 0x482c»). Назначения или ссылки на это значение обычно могут просто ссылаться на соответствующий адрес.
Для нелокальных переменных компилятор выполняет дополнительное разрешение для определения способа обнаружения, но обычно он по-прежнему не сохраняет имя переменной или функции напрямую.
Для вещей, которые вообще не являются переменными (структуры, методы и т. Д.), Компилятор выполняет различные шаги разрешения и оптимизации на основе принятых решений и установленных параметров. Но и здесь не хранится имя переменной или функции; он просто заменяет его соответствующими ссылками.
В некоторых случаях полезно включать имена переменных в выходные данные компилятора, например при отладке. В этих случаях создается таблица символов отладки . Это способ сопоставления адресов с именами , которые являются значимыми для людей, так что при возникновении сбоя вы можете увидеть «Stacktrace: function foo () ...» вместо «» Stacktrace: адрес памяти 0x4572 ... ".
В языках с возможностями метапрограммирования, таких как C #, Ruby или Java, имена часто становятся частью метаданных, которые хранятся вместе с объектом, а не просто заменяют каждую ссылку поиском в памяти адрес. Эти метаданные пригодятся, когда вы захотите сделать некоторые аккуратные трюки, которые практически невозможны в C во время выполнения, например, запросить «у каких объектов в этой коллекции есть поле с именем foo
?».