手动调用_chkstk

时间:2017-05-17 13:57:52

标签: c++ visual-studio inline-assembly

我有性能关键算法并使用内联汇编实现它,它带来了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

但这是另一个问题,它是否会产生任何负面影响?

0 个答案:

没有答案