Найти размер функции в C

Я изучаю указатели функций, я понимаю, что мы можем указывать на функции, используя указатели функций. Затем я предполагаю, что они остаются в памяти. Они остаются в стеке или куче? Можем ли мы рассчитать их размер?

 mawia10 июн. 2012 г., 11:48
что побудило вас выбрать такое имя пользователя? почему не было вашего собственного / более простого имени?
 mawia10 июн. 2012 г., 17:19
и почему вы не выбираете один?
 Vaccum12 июн. 2012 г., 10:37
@mawia Я думал, что это крутой номер, поэтому продолжил его использовать.
 user68100710 июн. 2012 г., 12:20
@ mawia Вы смеетесь? Они являются именами пользователей по умолчанию, если вы не выбираете одно из них.
 Yousha Aleayoub12 мар. 2018 г., 12:11
использование$ nm filename.o или же$ nm filename.obj затем посмотрите на "текст" раздел, который Hex ...

Ответы на вопрос(7)

Решение Вопроса

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

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

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

int first_function()
{
   ...
}

void second_function( int arg )
{
    ...
}

int main( void )
{
    int first_function_length = (int)second_function - (int)first_function ;
    int second_function_length = (int)main - (int)second_function ;

}

Однако YMMV; Я попробовал это в VC ++, и он дал только действительные результаты в "Release" строить; результаты для "Отладки" Сборка не имела реального смысла. Я полагаю, что это упражнение только для интереса и не имеет практического применения.

Конечно, другой способ оценить размер вашего кода - это посмотреть на разборку кода в вашем отладчике.

потому что они предназначены для данных только для чтения, тогда как стек и куча являются памятью для чтения и записи.

Вы действительно должны знать его размер во время выполнения? Если нет, вы можете получить это простымobjdump -t -i .text a.out где a.out - имя вашего двоичного файла..text где компоновщик помещает код, и загрузчик может сделать эту память доступной только для чтения (или даже только для выполнения). Если да, как было сказано в предыдущих постах, есть способы сделать это, но это сложно и непереносимо ... Клиффорд дал самое простое решение, но компоновщик редко помещает функцию таким последовательным образом в финальный двоичный файл. Другое решение - определить разделы в вашем скрипте компоновщика с помощью прагм и зарезервировать хранилище для глобальной переменной, которая будет заполнена компоновщиком секцией SIZEOF (...), содержащей вашу функцию. Это зависит от линкера, и не все линкеры предоставляют эту функцию.

то это должен быть размер STACK FRAME. Или еще лучше, пожалуйста, постарайтесь представить, какой именно, по вашему мнению, должен быть размер функции? Вы имеете в виду его статический размер, то есть размер всего его кода операции, когда он загружается в память? Если это то, что вы имеете в виду, то я не вижу, чтобы это была какая-либо функция, предоставляемая языком, чтобы это выяснить. взломать. Там может быть много. Но я не пробовал это.

Есть способы найти их размер, но ни один из них даже близко не подходит для переноски. Если вы считаете, что вам нужно / хотите знать размер, вполне вероятно, что вы делаете то, чего вам, вероятно, следует избегать.

 Vaccum12 июн. 2012 г., 10:39
@JerryCoffin Я имел в виду то же самое, размер кода.
 10 июн. 2012 г., 18:32
@mawia: я точно не знаю, что он имеет в виду. Я угадал размер кода, который вы обычно можете убедить компоновщика сообщить (например, с файлом карты).
 10 июн. 2012 г., 11:51
Но как вы найдете размер функции? ИЛИ, что более важно, как вы определяете «размер функции»? Если есть что-то вроде размера функции, это должен быть размер ее стека. ты согласен с этим?

т его оставаться в памяти.

Функции всегда находятся в памяти, независимо от того, используете вы их или нет, сохраняете ли вы указатель на них или нет.

Динамически распределенная память может быть освобождена, но это не имеет ничего общего с сохранением указателя на нее. Вы не должны хранить указатель на память, которую вы освободили, и вы должны освободить ее перед тем, как потерять указатель на нее, но язык не делает этого автоматически.

размеры функций генерируются компилятором во время компиляции, и все размеры известны компоновщику во время компоновки. Если вам абсолютно необходимо, вы можете заставить компоновщик удалить файл карты, содержащий начальный адрес, размер и, конечно, имя. Затем вы можете проанализировать это во время выполнения в вашем коде. Но я не думаю, что существует портативный, надежный способ их вычисления во время выполнения, не выходя за пределы C.

Ядро linux использует это для профилирования во время выполнения.

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

 10 июн. 2012 г., 09:25
@nhahtdh Да, но это выходит за рамки C, так как это скорее системная среда компилятора / среды выполнения. Я уверен, что Zeta-C, а также различные реализации C на основе JVM могут вычислить размер функции :)
 10 июн. 2012 г., 09:10
Иногда исполняемый код также может находиться в куче (но это код, сгенерированный во время выполнения программы).

Ваш ответ на вопрос