我有性能关键算法并使用内联汇编实现它,它带来了40%的性能提升,所以我想保留并使用它,但是有一个问题。
我使用naked declaration,这一切都由我决定,编译器不会在函数范围内添加任何内容。我的功能如下:
bool __declspec(naked) Foo(...)
{
__asm
{
push ebp
mov ebp, esp
sub esp, 0x10000
/*some code here*/
ret
}
}
如您所见,我有64KB的本地人,因此可能因堆栈损坏而崩溃。该编译器执行此操作,它会调用_chkstk例程来扩展堆栈。
在搜索时,有一些文件实现了这个例程:
C:\Program Files (x86)\Microsoft Visual Studio [version]\VC\crt\src\intel\chkstk.asm
我想问一下如何从那里导入和使用例程,以及是否有其他方法可以防止崩溃。
我能想到的是添加我自己的实现,类似的东西:
mov ecx, 0x10
guard_page_testing_starts:
test [esp], eax
sub esp, 0x1000
dec ecx
jnz guard_page_testing_starts
但这是另一个问题,它是否会产生任何负面影响?