gpt4 book ai didi

c++ - 创建指向运行时创建的函数的函数指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:00 25 4
gpt4 key购买 nike

我想做这样的事情:

for(int i=0;i<10;i++)
addresses[i] = & function(){ callSomeFunction(i) };

基本上,有一个函数地址数组,其行为与数字列表相关。

如果可以使用像 Boost.Lambda 这样的外部类就可以了。

编辑:经过一些讨论,我得出的结论是我不够明确。请阅读Creating function pointers to functions created at runtime


我最后真正想做的是:

class X
{
void action();
}

X* objects;

for(int i=0;i<0xFFFF;i++)
addresses[i] = & function(){ objects[i]->action() };


void someFunctionUnknownAtCompileTime()
{

}

void anotherFunctionUnknowAtCompileTime()
{

}

用程序集修补 someFunctionUnknownAtCompileTime() 以跳转到地址 [0] 处的函数

用程序集修补 anotherFunctionUnknownAtCompileTime() 以跳转到地址 [1] 处的函数

sth,我不认为你的方法会起作用,因为它们不是真正的函数,但我没有准确解释我想做什么。

最佳答案

如果我没理解错的话,您是在尝试用运行时生成的机器代码填充缓冲区,并获取指向该代码的函数指针,以便您可以调用它。

这是可能的,但具有挑战性。您可以使用 reinterpret_cast<>将数据指针转换为函数指针,但您需要确保为缓冲区分配的内存被操作系统标记为可执行。这将涉及系统调用(在 Windows iirc 上为 LocalAlloc(),在 Unix 上不记得了)而不是“普通的”malloc/new 调用。

假设您有一个可执行的内存块,您必须确保您的机器代码遵守您创建的函数指针指示的调用约定。这意味着在函数的开头压入/弹出适当的寄存器等。

但是,一旦你这样做了,你应该能够像使用任何其他函数一样使用你的函数指针。

可能值得研究一下开源 JVM(或 Mono),看看它们是如何做到的。这就是JIT编译的本质。

关于c++ - 创建指向运行时创建的函数的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2025228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com