我们正在为高级编译语言编写字节码,经过一些分析和优化,很明显当前最大的性能开销是我们用来跳转到字节的 switch 语句-代码案例。
我们调查了提取每个案例标签的地址并将其存储在字节码流本身中,而不是我们通常打开的指令 ID。如果这样做,我们可以跳过跳转表,直接跳转到当前执行指令的代码位置。这在 GCC 中非常有效,但是,MSVC 似乎不支持这样的功能。
我们尝试使用内联汇编来获取标签的地址(并跳转到它们),并且它有效,但是,使用内联汇编会导致 MSVC 优化器避免整个函数。
有没有办法让优化器仍然在代码上运行?不幸的是,我们不能将内联汇编提取到另一个函数中,而不是制作标签的那个函数,因为即使在内联汇编中也无法引用另一个函数的标签。有什么想法或想法吗?非常感谢您的意见,谢谢!
最佳答案
在 MSVC 中执行此操作的唯一方法是使用内联汇编(这基本上会让您对 x64 感到厌烦):
int _tmain(int argc, _TCHAR* argv[])
{
case_1:
void* p;
__asm{ mov [p],offset case_1 }
printf("0x%p\n",p);
return 0;
}
如果你打算做这样的事情,那么最好的方法是在汇编中编写整个解释器,然后通过链接器将其链接到主二进制文件(这就是 LuaJIT 所做的,这是导致虚拟机的速度非常快,当它没有运行 JIT 代码时)。
LuaJIT is open-source ,所以如果你走那条路,你可能会从中得到一些提示。或者,您可能想查看 forth 的来源(其创建者开发了 the principle 您正在尝试使用),如果有 MSVC 版本,您可以看到他们是如何完成它的,否则您会被 GCC 困住(其中 < em>不是坏事,它适用于所有主要平台)。
关于c++ - 标签地址 (MSVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6421433/