виртуальная машина — таблица поиска в массиве указателей функций C ++

У меня есть следующий код для эмуляции базовой системы на моем компьютере (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()

Есть ли польза от этого?

Есть ли способ сделать это быстрее?
Спасибо

1

Решение

Просто потому, что вы помечаете метод как inline для этого не требуется компилятор — это скорее подсказка, чем порядок.

Учитывая, что вы храните обработчики кода операции в массиве, компилятор должен будет поместить адрес функции в массив, поэтому он не может встроить его.

На самом деле нет ничего плохого в вашем подходе. Если вы действительно думаете, что у вас проблемы с производительностью, то получите некоторые показатели, в противном случае не беспокойтесь (на данный момент!). Концепция таблицы указателей на функции не является чем-то новым — на самом деле C ++ реализует виртуальные функции (например, vtable).

3

Другие решения

«Встроенный» означает «не генерировать вызов функции; вместо этого подставьте тело функции во время компиляции».

Вызов через указатель функции означает «вызов функции, подробности которой не будут известны до времени выполнения».

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

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

2

inline это всего лишь подсказка для вашего компилятора, он не гарантирует выполнения каких-либо вставок. Вы должны прочитать о встраивании (возможно, на ISO C ++ FAQ), так как слишком много вставок может фактически сделать ваш код помедленнее (через раздувание кода и связанную с этим виртуальную память).

1
По вопросам рекламы [email protected]