Задача: получить и преобразовать адрес функции. Смысл подразумевается следующий:
Имеем функцию
void func() {}; // имеем адрес 0x500000, к примеру
constexpr size_t inc_pointer = to_size_t(&func) + 5; // (*)
Где to_size_t - это макрос/constexpr функция, которая преобразует адрес функции в число на этапе компиляции. Реализация может быть следующая:
#define to_size_t(x) (size_t)(x) // C-style каст
#define to_size_t(x) reinterpret_cast
Почему я не написал cast сразу будет понятно ниже.
Проблема в том, что конструкция (*) превращается в следующий код
mov eax, 0x500000 // 0x500000 == адрес функции func
add eax, 5
...
Я же хочу добиться того, чтобы код был
mov eax, 0x500005
...
Попытка 1
Сast'ы ни к чему хорошему не привели, результат выше
Попытка 2
template
constexpr converter(T func) : _func(func) {};
};
#define to_size_t(x) converter
Для проверки constexpr'a я пользуюсь следующей функций:
template
Загвоздка в том, что constexpr union не хочет работать так, как мне нужно
print_it
Выслушаю ваши идеи.
P.S. А следующий код вообще крашит студию (2015-ю)
template
print
UPDATE
Ответ получен, видимо проблему придётся решать, заменяя конструкции соответствующим образом уже после компиляции в готовом исполняемом файле.
Ответ
Всякий раз программа, вообще говоря, загружается в разное место в памяти - как тут можно говорить об адресе на уровне компиляции?
Максимум, что можно (теоретически!) получить, и то на уровне компоновки - это относительное смещение адресов.
Комментариев нет:
Отправить комментарий