我正在开发一个虚拟机,我想让调用编译函数成为可能。但是,由于每个函数最终可能具有不同的签名,我的计划是将所有调用概括为 2 种可能的场景 - 调用没有返回和没有参数的函数,以及调用带有一个void *
参数的函数。
计划是使用它类似于thiscall
- 所有参数在传递的指针的位置正确对齐,并且通过间接检索参数。至少 IMO 不应该比从堆栈中读取它们慢。
所以而不是:
int foo(int a, int b) { return a+b; }
我可以有类似的东西:
void foo2(void *p) {
*(int*)p = *(int*)(p + 4) + *(int*)(p + 8);
}
所以我的问题是使用这种方法可能会出现什么问题?我可以马上说的是它“在黑暗中”工作,因此正确计算偏移量至关重要。这也有点不方便,因为所有临时人员都需要由用户提供。假设我的 VM 编译器将处理这两个问题,我最关心的是性能——我不想创建一个普通函数,并且为每个普通函数创建一个void *
包装器——我想直接对所有函数使用该约定,所以我不禁想知道编译器在编译代码中使用时内联函数的工作有多好?我是否会忽略任何其他可能的性能影响(不包括__fastcall
哪个会使用更多的寄存器和更少的间接)?