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


первый скрин – конец функции в программке, второй конец функции MessageBox… так что …не знаю, сигнатура С9С0 – не катит….
Адилет Курмангалиев
"извлекать из стека адрес возврата" в том то и вопрос - как это написать?
yну ето задается типом веть
unsigned long 8байт
unsigned long 8байт
Vladimir Solonenko
во первых unsigned long это 4 байта
а тип возвращаемого значения к этому отношения не имеет...
а тип возвращаемого значения к этому отношения не имеет...
А что такое размер функции?
Кол-во строк/символов содержащееся в теле функции?
Кол-во строк/символов содержащееся в теле функции?
Vladimir Solonenko
это размер который функция занимает в памяти...
Ну.. . есть способ.
Называется "метод научного тыка" и вообще так делать нельзя, но все же:
Выставляете в ручную в настройках проекта фиксированный размер стека, например 128 кб. Затем прямо из мейна рекурсивно вызываете функцию пока прога не упадет. Когда упадет (ошибка стек оверфлоу) считаете размер функции примерно равен stackSize / callNum.
Это решение не переносимо, и размер зависит от компилятора и платформы.
Инструкция под кодом 0xC9 0xC3 скорей всего ret.
Предложенное тобой решение имеет ряд подводных камней:
1.Итоговый размер функции кроме самой функции содержит код по загрузке и очищению регистров в стек. И он может как включаться в результирующий размер функции так и не включаться. Это зависит от того кто чистит стек. Более того такого дополнительного кода вообще может не быть, если компилер решил функцию заинлайнить. Поэтому это решение платформо и компилерозависемо.
2. На разных платформах инструкция ret может иметь разный код, поэтому опять ничего не гарантированно.
3. И наконец код 0xC9 0xC3 может быть суффиксом какой либо другой инструкции, и как результат вычисленный размер функции будет меньше реального.
Я когда то сам искал решение такой задачи. И не нашел.
Называется "метод научного тыка" и вообще так делать нельзя, но все же:
Выставляете в ручную в настройках проекта фиксированный размер стека, например 128 кб. Затем прямо из мейна рекурсивно вызываете функцию пока прога не упадет. Когда упадет (ошибка стек оверфлоу) считаете размер функции примерно равен stackSize / callNum.
Это решение не переносимо, и размер зависит от компилятора и платформы.
Инструкция под кодом 0xC9 0xC3 скорей всего ret.
Предложенное тобой решение имеет ряд подводных камней:
1.Итоговый размер функции кроме самой функции содержит код по загрузке и очищению регистров в стек. И он может как включаться в результирующий размер функции так и не включаться. Это зависит от того кто чистит стек. Более того такого дополнительного кода вообще может не быть, если компилер решил функцию заинлайнить. Поэтому это решение платформо и компилерозависемо.
2. На разных платформах инструкция ret может иметь разный код, поэтому опять ничего не гарантированно.
3. И наконец код 0xC9 0xC3 может быть суффиксом какой либо другой инструкции, и как результат вычисленный размер функции будет меньше реального.
Я когда то сам искал решение такой задачи. И не нашел.
Vladimir Solonenko
а на шёт 0xC9 0xC3 что думаете ?
Похожие вопросы
- Вопрос от начинающего ))) Список вопросов (питон, Си и в принципе работа ПК) (Мало что понимаю)
- У меня простенький вопрос по HTML
- Вопрос по Си
- Вопрос по СИ (внутри)
- вопрос по си
- Вопрос по Си. if ((i++)==10) и i++ if (i==10) будет ли первый пример работать быстрее чем второй?
- Народ, помогите, по вопросу языка СИ, команды fgets!
- Помогите написать простенькие программки! Язык не важен-от Бэйсика до Си++
- Вопрос про компиляторов ЯП Си..
- Разница между Си и Си++