2015-01-20 4 views
1

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

ответ

2

Статические поля выделяются аналогично области пространства имен или глобальным переменным ... существует в основном одна или две области (переменные, нуждающиеся в инициализации 0, могут быть отделены от тех, для которых требуются начальные значения, отличные от нуля), последовательно заполненные всеми такими переменными в перевод. Если переменная определена в другой переменной, адрес будет исправлен во время связывания или загрузки. Обратите внимание, что адреса, как правило, эффективно жестко закодированы (фиксированный адрес, возможно, из определенного регистра сегмента данных), в отличие от стека (который может быть относительным регистром стека, но регистр стека изменяется, поскольку функции вызываются и возвращаются, в отличие от регистров сегмента данных который может быть установлен на одно и то же значение во время работы потока) или переменные, размещенные в куче (где адрес определяется во время malloc или new.

+0

См. также: http://en.wikipedia.org/wiki/Symbol_table –

+1

Это не отличается от поиска глобальных статических переменных или других функций –

Смежные вопросы