2014-11-29 4 views
1

Есть ли какая-либо индексная таблица в программе, в которой хранятся метаданные для каждой функции в исполняемом файле? Мне нужно приложить указатель на каждый указатель функции; Например:Как прикреплять метаданные к функциям?

if (!HasMetadata(functionPointer)) //Something of the form ...(*)(...) 
    SetMetadata(new FunctionMetadata()); //Pointer of object of some structure of data 
((FunctionMetadata*)GetMetadata(functionPointer))->Counter++; 

ПРИМЕЧАНИЕ: Я рассматривал использование объекта по типу ключа/значения; Я не могу, потому что у меня более 3000 функций, которые потенциально все они должны быть в таблице. Если бы у меня не было 3000+ функций, я бы вручную рассмотрел добавление статического значения для каждой функции.

+0

Какая часть этого неясна ? – LyingOnTheSky

+0

В чем проблема с наличием карты (или хэша) с 3000+ пар ключ/значение? –

+0

@ FélixCantournet Очень медленно (?). Это своего рода самомодифицирующийся код; Я должен чрезмерно использовать его. – LyingOnTheSky

ответ

-1

C++ не имеет встроенных метаданных, связанных с функциями, классами или экземплярами. Однако есть несколько доступных библиотек, которые с некоторой дисциплиной позволяют добавлять метаданные к различным вещам. См. Вопрос this stackoverflow, среди прочих.

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

// we'll use a generic function pointer as the key type for functions. Note that things will 
// be somewhat trickier should you want to work with virtual functions or instance 
//members. 

typedef void(*)() FunctionPtr; 

static std::map<FunctionPtr, Metadata *> gFunctionMetadata; 

Metadata *GetMetadata(FunctionPtr functionPtr){ 
    return gFunctionMetadata[functionPtr]; 
} 

красивее решение, конечно, будет иметь класс одноплодной (MetadataManager или некоторые такие), который содержит карту и предоставляет методы для доступа к метаданным ..

+0

' void * 'is not гарантированно иметь возможность удерживать указатель на функцию. –

+0

Какой тип будет? Мой C++ немного ржавый: -/ – jjm

+0

Я считаю, что любой указатель функции будет работать, поэтому 'void (*)()' например. Указатели для членов - это еще одна история. –

Смежные вопросы