Minimalbeispiel
Code: Select all
#include
using func_t = void(*)(void* data);
void int_func(int* data)
{
std::println("{}", *data);
}
void const_int_func(const int* data)
{
std::println("{}", *data);
}
void int_arry_func(int(&data)[2])
{
for (int elem : data)
std::println("{}", elem);
}
void const_int_arry_func(const int(&data)[2])
{
for (int elem : data)
std::println("{}", elem);
}
int main()
{
func_t func_1 = reinterpret_cast(int_func);
func_t func_2 = reinterpret_cast(const_int_func);
func_t func_3 = reinterpret_cast(int_arry_func);
func_t func_4 = reinterpret_cast(const_int_arry_func);
int val = 5;
int vals[2] = { 1, 2 };
func_1(& val);
func_2(& val);
func_3(vals);
func_4(vals);
return 0;
}
Ich implementieren einen vierten Interpreter, der über ein Wörterbuch (nicht std::map) verfügt, das vierte Wörter Implementierungsfunktionen zuordnet. Dieser verwendete Funktionszeiger hat die folgende Schnittstelle:
Code: Select all
export using execution_token_t = error_status(*)(environment& env, void* data) noexcept;Code: Select all
error_status create_rt(environment& env, void* data) noexcept
{
return env.dstack.push(reinterpret_cast(data));
}
error_status colon_rt(environment& env, void* data) noexcept
{
if (env.instruction_ptr)
{
if (const auto status = env.rstack.push(env.instruction_ptr); status != error_status::success)
return status;
}
env.instruction_ptr = static_cast(data) - 1;
return error_status::success;
}
Ich suche nach einer Lösung ohne Overhead.
Mobile version