2016-04-27 12 views
1

У меня есть следующий код для эмуляции базовой системы на моем компьютере (x86):Lookup таблицу Функция производительности указатель массива C++

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() 

Есть ли какие-либо преимущества делают это?

Есть ли способ ускорить его? Thanks

+0

Вопрос о рабочем коде, возможно, лучше для http://codereview.stackexchange.com/ – user463035818

+1

Можете ли вы создать игрушечный пример фактического рабочего кода, который соответствует вашему шаблону? Даже с 3 опкодами? Как написано, большие проблемы с производительностью могут быть скрыты вашим псевдокодом. Кроме того, «сделать лучше» - это плохой вопрос; явным образом ваш код выходит из строя, или что-то неожиданное. – Yakk

+0

@ tobi303 это пример/псевдокод, который не соответствует теме обзора кода, на этом сайте нам нужен реальный рабочий код. См. [Руководство по обзору кода для пользователей переполнения стека] (http://meta.codereview.stackexchange.com/questions/5777/a-guide-to-code-review-for-stack-overflow-users) – Phrancis

ответ

3

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

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

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

+0

@JoshKelley - спасибо! Я исправил это. – Sean

2

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

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

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

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

1

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