У меня есть следующий код для эмуляции базовой системы на моем компьютере (x86):
typedef void (*op_fn) ();
void add()
{
//add Opcode
//fetch next opcode
opcodes[opcode]();
}
void nop()
{
//NOP opcode
//fetch next opcode
opcodes[opcode]();
}
const op_fn opcodes[256] =
{
add,
nop,
etc...
};
и я называю это «стол» через opcodes[opcode]()
Я пытаюсь улучшить работу моего переводчика.
Как насчет включения каждой функции, как
inline void add()
inline void nop()
Есть ли польза от этого?
Есть ли способ сделать это быстрее?
Спасибо
Просто потому, что вы помечаете метод как inline
для этого не требуется компилятор — это скорее подсказка, чем порядок.
Учитывая, что вы храните обработчики кода операции в массиве, компилятор должен будет поместить адрес функции в массив, поэтому он не может встроить его.
На самом деле нет ничего плохого в вашем подходе. Если вы действительно думаете, что у вас проблемы с производительностью, то получите некоторые показатели, в противном случае не беспокойтесь (на данный момент!). Концепция таблицы указателей на функции не является чем-то новым — на самом деле C ++ реализует виртуальные функции (например, vtable).
«Встроенный» означает «не генерировать вызов функции; вместо этого подставьте тело функции во время компиляции».
Вызов через указатель функции означает «вызов функции, подробности которой не будут известны до времени выполнения».
Эти две особенности в корне противоположны. (Лучшее, на что вы можете надеяться, это то, что достаточно продвинутый компилятор может статически определить, какая функция вызывается через указатель на функцию в очень ограниченных обстоятельствах, и встроить их.)
switch
блоки обычно реализуются как таблицы переходов, которые могут иметь меньше накладных расходов, чем вызовы функций, поэтому замена массива указателей на функции switch
блок и использование inline может иметь значение.
inline
это всего лишь подсказка для вашего компилятора, он не гарантирует выполнения каких-либо вставок. Вы должны прочитать о встраивании (возможно, на ISO C ++ FAQ), так как слишком много вставок может фактически сделать ваш код помедленнее (через раздувание кода и связанную с этим виртуальную память).