簡體   English   中英

C ++中的動態堆棧分配

[英]Dynamic stack allocation in C++

我想在堆棧上分配內存。

聽說_alloca / alloca,我明白這些是編譯器特有的東西,我不喜歡。

所以,我想出了我自己的解決方案(這可能有它自己的缺點),我希望你檢查/改進它,這樣我們就可以一勞永逸地使用這些代碼:

/*#define allocate_on_stack(pointer, size) \
    __asm \
    { \
        mov [pointer], esp; \
        sub esp, [size]; \
    }*/
/*#define deallocate_from_stack(size) \
    __asm \
    { \
        add esp, [size]; \
    }*/

void test()
{
    int buff_size = 4 * 2;
    char *buff = 0;

    __asm
    { // allocate
        mov [buff], esp;
        sub esp, [buff_size];
    }

    // playing with the stack-allocated memory
    for(int i = 0; i < buff_size; i++)
        buff[i] = 0x11;

    __asm
    { // deallocate
        add esp, [buff_size];
    }
}

void main()
{
    __asm int 3h;
    test();
}

用VC9編譯。

你在其中看到了什么缺陷? 例如,我不確定從ESP中減去“任何類型的CPU”的解決方案。 此外,我想使注釋掉的宏工作但由於某種原因我不能。

對不起,但你最好不要使用alloca而不是那種東西。 它不僅具有特定的x86,而且如果使用優化編譯,它可能會給出意想不到的結果。

alloca受到許多編譯器的支持,因此您不應該很快遇到問題。

您的解決方案比alloca更依賴於平台(它不適用於x64)。 有一種標准兼容且非常快速的方式來分配內存。 您可以預先分配大塊內存並自行管理內存分配。 看看Boost Pool Library

不要定義deallocate_from_stack 實現后,如果在allocate_from_stack之后立即調用, deallocate_from_stack可能只會執行您期望的操作,甚至可能不會。 另外,堆棧分配的整個要點是避免必須free或任何等價物。

分配宏看起來很好,但正如其他人已經注意到它只適用於x86(這讓你擔心“任何類型的CPU”都沒有意義)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM