Как имя переменной хранится в C?
Я хочу спросить, как C хранятся в C?
Чтобы более четко рассмотреть следующий код:
int main() {
int a = 1, b;
b = a + 2;
return 0;
}
Например, здесь, в какой памяти C хранятся имена переменных мест.
Например, если &a=0x12A7
(предположим) &b=0x123B1
, то как и где c хранит имена переменных, например, в которых хранится имя памяти a
?
Ответы
Ответ 1
C не сохраняет имя переменных. Его компилятор, который хранит имена переменных в таблице символов компилятора.
Эта структура данных создается и поддерживается компилятором.
example таблицы символов для фрагмента
// Declare an external function
extern double bar(double x);
// Define a public function
double foo(int count)
{
double sum = 0.0;
// Sum all the values bar(1) to bar(count)
for (int i = 1; i <= count; i++)
sum += bar((double) i);
return sum;
}
может содержать по крайней мере следующий символ:
![введите описание изображения здесь]()
Ответ 2
Переменные имена не обязательно должны быть сохранены! Компилятор может полностью избавиться от них. Представьте себе, если компилятор достаточно умный, он может сократить вашу всю программу до этого:
int main(){
return 0;
}
Обратите внимание, что эффект этой программы в точности совпадает с вашим оригиналом, и теперь нет никаких переменных! Не нужно называть их сейчас, есть ли?
Даже если переменные в вашем коде были фактически использованы, их имена являются просто удобной записью, когда вы пишете программу, но не нужны процессору, когда он выполняет ваш код. Что касается микропроцессора, то такая функция:
int foo(int x, int y) {
int z = x + y;
return z * 2;
}
Может получиться скомпилированный код, который делает это, в некоторой гипотетической простой архитектуре набора инструкций (ISA):
ADD # consumes top two values on stack (x and y), pushes result (z)
PUSH 2 # pushes 2 on stack
MULT # consumes top two values on stack (z and 2), pushes result
RET
Более длинная история заключается в том, что имена переменных иногда хранятся для целей отладки. Например, если вы используете GCC, вы можете передать параметр -g
, чтобы испустить "таблицу символов", которая содержит такие вещи, как имена переменных для отладки. Но просто не нужно запускать программу, и она не покрывается стандартом языка - это функция реализации, которая отличается платформой.
Ответ 3
Хорошо сначала, если вы просто получаете свою голову на пролив с помощью C, с чего начать:
http://condor.cc.ku.edu/~grobe/intro-to-C.shtml
Но это более практично, чем ваш вопрос. Чтобы ответить на это, мы сначала спросим, почему переменные имеют адреса. Почему здесь находится стек. Для работы программы обратные вызовы должны быть направлены в соответствующий буфер, чтобы все части соответствовали друг другу, как было разработано. Теперь, к чему я верю, был исходный вопрос, именно так решается фактический адрес, для ответа на это вам нужно будет понять, как процессор реализует кучу.
https://en.wikipedia.org/wiki/Memory_management
"Поскольку точное местоположение распределения неизвестно заранее, к нему обращаются косвенно, обычно с помощью ссылки на указатель. Конкретный алгоритм, используемый для организации области памяти, выделения и освобождения фрагментов, связан с ядром.."
Это возвращает нас к практической стороне вещей с абстракцией указателям:
https://en.wikipedia.org/wiki/C_dynamic_memory_allocation
Надеюсь, вам дается более четкое представление о том, что под капотом:)
Счастливая игра.