Код: Выделить всё
s16 read_value()
{
static s16 temp;
TYPE_BYTES_WORD Type_F,Data1,Data2;
u16 temp2;
void some_fnc1()
{
//здесь на самом деле идет какая-то обработка
}
void some_fnc2()
{
//здесь на самом деле идет какая-то обработка
}
void some_fnc3()
{
//здесь на самом деле идет какая-то обработка
}
void (*fnc_table[3])()=
{
some_fnc1, // 00
some_fnc2, // 01
some_fnc3, // 02
};
//здесь опять обработка и далее вызов функции по указателю
(*fnc_table[Type_F.BYTES.BYTEL])();
}
А проблема вот в чем, при отладке заметил, что попадая в read_value() процессор гуляет сперва по массиву fnc_table, потом ещё что-то невообразимо и неописуемое делает и потом таки исполняет код, на тратит на это столько тактов процессора, что весь смысл ухода к указателям на функции теряет смысл и проще сделать все в виде switch-case. Все исполняется нормально, когда функции объявлены вне основной, реально указатель процессора перескакивает на нужную функцию, а тут бардак.
Вопрос это нормально для такого способа объявления функций? Может есть какие-то директивы типа static, inline, и подобные для компилятора, чтобы он помещал объявления some_fncХ и fnc_table в свободное место "кода" до точки входа в функцию read_value() чтобы процессор попадал сразу на "полезный код", а не тупил и не гулял по непонятным строкам, которые ничего конечно не меняют, причем если меняют, то потом процесс перепрыгивает на некие участки кода, которые чистят "следы этого гуляния", но тратят процессорное время? Причем я не хочу включать оптимизацию, я сейчас на этапе отладки, а тут такие непонятные вещи, с оптимизацией вообще черт ногу сломит, что будет показывать.


