Другие языки программирования и технологии

простенький вопрос по Си....

как стандартными средствами то есть не через API получить размер функции.... sizeof() возвращает размер объекта или типа например 4=sizeof(unsigned long); а как получить размер функции ???
VS
Vladimir Solonenko
10 484
А что такое вообще размер функции? Имеется в виду размер возвращаемого значения?
RD
Rajabali Davlatov
758
Лучший ответ
Vladimir Solonenko это размер который функция занимает в памяти...
Rajabali Davlatov Кстати, sizeof(unsigned long)=sizeof(long), можно в целях оптимизации лишнее слово не писать.
если нужно узнать размер своей функ можно пошаманить с метками иль написать пустую процедуру, которая будет вызываться в конце нужной процедуры и извлекать из стека адрес возврата, разность и будет размер, для стороней хз... что касается С9 С3 -
вот пожалуй простой пример, где он не прокатит-





первый скрин – конец функции в программке, второй конец функции MessageBox… так что …не знаю, сигнатура С9С0 – не катит….
Адилет Курмангалиев "извлекать из стека адрес возврата" в том то и вопрос - как это написать?
yну ето задается типом веть
unsigned long 8байт
Vladimir Solonenko во первых unsigned long это 4 байта
а тип возвращаемого значения к этому отношения не имеет...
А что такое размер функции?
Кол-во строк/символов содержащееся в теле функции?
Vladimir Solonenko это размер который функция занимает в памяти...
Ну.. . есть способ.
Называется "метод научного тыка" и вообще так делать нельзя, но все же:
Выставляете в ручную в настройках проекта фиксированный размер стека, например 128 кб. Затем прямо из мейна рекурсивно вызываете функцию пока прога не упадет. Когда упадет (ошибка стек оверфлоу) считаете размер функции примерно равен stackSize / callNum.
Это решение не переносимо, и размер зависит от компилятора и платформы.

Инструкция под кодом 0xC9 0xC3 скорей всего ret.
Предложенное тобой решение имеет ряд подводных камней:
1.Итоговый размер функции кроме самой функции содержит код по загрузке и очищению регистров в стек. И он может как включаться в результирующий размер функции так и не включаться. Это зависит от того кто чистит стек. Более того такого дополнительного кода вообще может не быть, если компилер решил функцию заинлайнить. Поэтому это решение платформо и компилерозависемо.
2. На разных платформах инструкция ret может иметь разный код, поэтому опять ничего не гарантированно.
3. И наконец код 0xC9 0xC3 может быть суффиксом какой либо другой инструкции, и как результат вычисленный размер функции будет меньше реального.

Я когда то сам искал решение такой задачи. И не нашел.
Vladimir Solonenko а на шёт 0xC9 0xC3 что думаете ?