Является ли конечный адрес памяти объявленных функций в любом языке программирования (C ++, C #, Java, C ...) относительным или абсолютным? - PullRequest
1 голос
/ 25 февраля 2012

Является ли конечным адресом памяти объявленных функций на любом языке программирования (C ++, C #, Java, C ...) относительным или абсолютным? (Я не задаю режим адресации языка машинного кода, относительный или абсолютный)

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

если это абсолютное значение, это означает, что два потока вызывают одну и ту же функцию, они будут вводить один и тот же адрес !! (зависит ли это от статической или нестатической функции) каждого объекта может использоваться для хранения методов (функций). Тогда размер объекта будет очень большим!

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Вы не правы.

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

Для библиотек виртуальный адрес может быть абсолютным или относительным. Если он относительный, он называется «позиционно-независимым кодом» и полезен, если библиотека не может загружаться по предпочтительному адресу.

Код не помещается в стек. Локальные (автоматическая длительность) переменные обычно есть, что означает отдельные копии для одновременных и рекурсивных / реентерабельных вызовов. Поскольку код доступен только для чтения, наличие нескольких потоков, обращающихся к одному и тому же адресу, не составляет проблем.

Языки JITted определяют адрес каждой функции во время выполнения, во время преобразования из промежуточного языка (такого как байт-код Java) в машинный код.

Функции также не хранятся внутри объектов. Часто объект имеет указатель на массив указателей на функции для поддержки полиморфизма (это называется виртуальными функциями). Эти указатели функций доступны относительно объекта, но конечный адрес кода является абсолютным (опять же, только виртуальный адрес).

И если функция встроена, то она может существовать только как части, смешанные с другими функциями.

0 голосов
/ 25 февраля 2012

В случае языка программирования Java вы не можете изменять байт-код функции во время выполнения (хотя вы можете динамически создавать и загружать новые классы).На многих современных машинах вы не можете одновременно выполнять и изменять одно и то же место в памяти, так что это снова невозможно.Даже когда это разрешено операционной системой, никакой нормальный код не собирается это делать.

Локальные переменные обычно хранятся в стеке, а не в инструкциях функций.В случае статических локальных переменных в C они будут сохранены в тексте глобальной программы, опять же, не в функции.

...