2014-09-17 2 views
-6

Когда функция вызывается, скажем, в C++, находится ли она в определенном месте в памяти, поскольку существуют указатели функций? Если да, то где именно? Как насчет классов? Сохранена ли память для определения классов?Где находятся функции языка программирования в памяти?

+2

_ «Если да, где именно?» _ Текст/сегмент кода вашей программы. Попробуйте найти ссылки на карты. –

+1

Если бы у него не было места, вы бы не могли его назвать! Механика компиляции, компоновки, перемещения и загрузки имеет архитектуру/ОС и слишком широкую для SO. –

ответ

2

Да, функции расположены в определенном месте в памяти. В контексте виртуальной памяти (напротив физических кэшей) они хранятся ниже кучи и ниже раздела, называемого Data (глобальные переменные), в разделе Text. Все это загружается при чтении исполняемого файла; все это делается в двоичном формате, которое является индивидуальным с сборкой, поэтому вы никогда не увидите это в своем коде на C. Однако, если вы хорошо знаете процессор, вы иногда можете манипулировать им при чтении из раздела кода вашего кода. Однако это может привести к segfault, и, как правило, вы не можете писать в раздел кода.

Как указатели на переменные, указатели на функции указывают на место в общем стеке (см. this helpful site). На самом деле существует регистр, посвященный тому, какая именно программа в данный момент выполняется.

Определения классов и функции-члены также имеют определенное место в стеке; Я не совсем уверен, но я верю, что они идут в Data.

+0

Вы не уверены в определениях классов? –

+0

@ArmonSafai Нет, я не уверен; абстракция класса усложняет ситуацию. Например, должны ли функции-члены перейти в раздел кода? Мы можем оставить указатель на них в нашем разделе классов, где бы это ни было, но это лишний прыжок, они также могут быть встроены (это не совсем то же самое, что и ключевое слово inline, насколько я знаю). – Dan

+0

Хорошо, спасибо за ваш ответ, вы уверены в функциях, хотя верно? –

-1

Что касается классов, на C++ (и все языки ООП, если это имеет значение), они обычно создаются в куче. Хотя C++ может создать его в стеке, если вы опустили ключевое слово new, но это обычно не рекомендуется, потому что классы имеют тенденцию быть тяжелыми ресурсами, но это означает, что у вас будет утечка памяти, если вы явно не указали delete ,

Для указателей функций они обычно являются указателями в стеке, указывающими на отдельные блоки кода в постоянной памяти.

0

Все это может быть неправильно, это не моя специальность. Но насколько я знаю ...

Функция во время выполнения - это позиция в исполняемом файле, которую может вызывать «нижняя» часть, изменяя стек ... неважно, я не буду пытаться объяснить это в дальнейшем.

Класс не сохраняется в памяти. Это совершенно концептуально. Скажем, у вас есть следующая структура.

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 в памяти.

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