Когда функция вызывается, скажем, в C++, находится ли она в определенном месте в памяти, поскольку существуют указатели функций? Если да, то где именно? Как насчет классов? Сохранена ли память для определения классов?Где находятся функции языка программирования в памяти?
ответ
Да, функции расположены в определенном месте в памяти. В контексте виртуальной памяти (напротив физических кэшей) они хранятся ниже кучи и ниже раздела, называемого Data (глобальные переменные), в разделе Text. Все это загружается при чтении исполняемого файла; все это делается в двоичном формате, которое является индивидуальным с сборкой, поэтому вы никогда не увидите это в своем коде на C. Однако, если вы хорошо знаете процессор, вы иногда можете манипулировать им при чтении из раздела кода вашего кода. Однако это может привести к segfault, и, как правило, вы не можете писать в раздел кода.
Как указатели на переменные, указатели на функции указывают на место в общем стеке (см. this helpful site). На самом деле существует регистр, посвященный тому, какая именно программа в данный момент выполняется.
Определения классов и функции-члены также имеют определенное место в стеке; Я не совсем уверен, но я верю, что они идут в Data.
Вы не уверены в определениях классов? –
@ArmonSafai Нет, я не уверен; абстракция класса усложняет ситуацию. Например, должны ли функции-члены перейти в раздел кода? Мы можем оставить указатель на них в нашем разделе классов, где бы это ни было, но это лишний прыжок, они также могут быть встроены (это не совсем то же самое, что и ключевое слово inline, насколько я знаю). – Dan
Хорошо, спасибо за ваш ответ, вы уверены в функциях, хотя верно? –
Что касается классов, на C++ (и все языки ООП, если это имеет значение), они обычно создаются в куче. Хотя C++ может создать его в стеке, если вы опустили ключевое слово new
, но это обычно не рекомендуется, потому что классы имеют тенденцию быть тяжелыми ресурсами, но это означает, что у вас будет утечка памяти, если вы явно не указали delete
,
Для указателей функций они обычно являются указателями в стеке, указывающими на отдельные блоки кода в постоянной памяти.
Все это может быть неправильно, это не моя специальность. Но насколько я знаю ...
Функция во время выполнения - это позиция в исполняемом файле, которую может вызывать «нижняя» часть, изменяя стек ... неважно, я не буду пытаться объяснить это в дальнейшем.
Класс не сохраняется в памяти. Это совершенно концептуально. Скажем, у вас есть следующая структура.
struct idk
{
char* name;
int index;
void* data;
};
Ну, new idk
во время выполнения на самом деле не смотреть на какой-то определение, чтобы знать, что выделить. Вместо этого компилятор показывает все, так что конечным результатом является то, что new idk
оказывается концептуальным эквивалентом new char [sizeof(idk)]
, хотя это не учитывает выравнивание и упаковку. Во всяком случае, поэтому ссылки также не имеют какой-либо таблицы, на которую можно посмотреть, какие переменные есть, они скорее также определяются во время компиляции, так что int n = idk_thing.index
, возможно, будет действовать как int n = *((int*)(&idk_thing + sizeof(char*));
и так далее.
И, конечно же, хранилище класса реализовано почти идентично хранилищу структуры, а любые функции класса - это просто старые функции, которые, опять же, компилятор устанавливает определенный способ, чтобы он изменял переменные в класса, обратившись к хранилищу экземпляра класса. Я предполагаю, что это делается путем передачи указателю на хранилище функции, которая обращается к этому блоку памяти с помощью смещений в зависимости от того, с какой переменной она работает (точно так же, как то, что я говорил о структурах).
Теперь, что касается указателей функций, если я по крайней мере нахожусь на правильном пути с скомпилированным эквивалентом функций, я бы сказал, что указатели на функции - это просто цифры, которые представляют местоположение в загруженном исполняемом файле, которое является исходным местом для функции, так же как char*
- это число, предназначенное для представления местоположения char
в памяти.
- 1. Функции языка программирования
- 2. Функции языка программирования в последовательности выполнения
- 3. Где находятся параметры этой функции?
- 4. Встраивание языка программирования в программу
- 5. Изучение понятий языка программирования
- 6. относительно языка программирования Java
- 7. Синтаксис языка программирования Java
- 8. Идентификация языка программирования
- 9. Где находятся функции сайта в sharepoint?
- 10. Где находятся библиотеки Erlang?
- 11. Дерево языка программирования
- 12. Выбор языка программирования
- 13. сборка проблема языка программирования
- 14. Идентификатор языка программирования Exe
- 15. Создание языка программирования
- 16. примитивы языка программирования
- 17. Внедрение нового языка программирования
- 18. Синтаксис языка программирования Swift
- 19. Определение языка программирования в PHP
- 20. Помощь в выборе языка программирования
- 21. Сохранение языка программирования в реестре
- 22. Методологии проектирования простого языка программирования
- 23. Где находятся таблички в Mnesia?
- 24. Где находятся аргументы командной строки?
- 25. Лексический анализ языка программирования Python
- 26. Можно ли полагаться на функции по умолчанию для языка программирования?
- 27. Выбор модели согласования для параллельного языка программирования
- 28. Где я могу получить код C для языка программирования TCL?
- 29. Где находятся фиктивные сотрудники в документах в памяти?
- 30. Где статические члены находятся в памяти, это постоянное поколение?
_ «Если да, где именно?» _ Текст/сегмент кода вашей программы. Попробуйте найти ссылки на карты. –
Если бы у него не было места, вы бы не могли его назвать! Механика компиляции, компоновки, перемещения и загрузки имеет архитектуру/ОС и слишком широкую для SO. –