C ++中的动态堆栈分配

时间:2010-05-21 14:30:36

标签: c++ stack allocation

我想在堆栈上分配内存。

听说_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”的解决方案。 此外,我想使注释掉的宏工作,但由于某种原因,我不能。

3 个答案:

答案 0 :(得分:8)

对不起,但是你最好不要使用alloca而不是那种东西。它不仅具有特定的x86,而且如果使用优化编译,它可能会产生意想不到的结果。

许多编译器都支持alloca,因此您不应该很快遇到问题。

答案 1 :(得分:3)

您的解决方案比alloca更依赖于平台(它不适用于x64)。有一种标准兼容且非常快速的方式来分配内存。您可以预先分配大块内存并自行管理内存分配。看看Boost Pool Library

答案 2 :(得分:1)

不要定义deallocate_from_stack。实施后,deallocate_from_stack可能只会在allocate_from_stack后立即调用 时执行您所期望的操作,甚至可能不会。另外,堆栈分配的整个要点是避免必须调用free或任何等价物。

分配宏对我来说很好看,不过正如其他人已经注意到它只适用于x86(这让你担心“任何类型的CPU”都没有用)。