C++中的动态堆栈分配

3

我想在堆栈上分配内存。

听说过 _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”的解决方案。 另外,我想让注释掉的宏起作用,但出于某种原因我无法做到。


注意: "__asm int 3h" 是为那些要使用 Olly-Debugger 进行调试的人准备的... 在那里,您可以非常清楚地看到堆栈。 - Poni
哈哈 Konrad - 嗯,大家 - 请不要检查/改进我的语法技能,因为我已经放弃了它们 (: - Poni
9
内联 x86 汇编比 alloca 更加依赖于编译器和平台。 - Mike Seymour
2
你试图通过强制从堆栈分配来解决什么实际问题? - Mark B
3个回答

8

抱歉,你最好使用alloca而不是做那种事情。它不仅特定于x86,而且如果启用了优化,可能会产生意外的结果。

许多编译器都支持alloca,所以你不应该很快遇到问题。


作为确认,我也从未使用过不支持alloca的编译器。有些人拼写不同,但可以通过#define解决这个问题。(话虽如此,虽然我使用了许多编译器,但肯定没有使用所有可用的编译器。) - please delete me

3

您的解决方案比alloca更依赖于平台(它在x64上无法使用)。有一种符合标准且相当快速的方式可以分配内存。您可以预先分配大块内存并自行管理内存分配。可以参考Boost Pool Library


1
不要定义deallocate_from_stack。实现时,只有在紧接着调用allocate_from_stack之后立即调用deallocate_from_stack,甚至可能连这个都不行,deallocate_from_stack才能像你期望的那样工作。此外,堆栈分配的整个目的就是避免调用free或任何等效函数。
我认为分配宏看起来很好,尽管其他人已经指出它只适用于x86(这使得你对“任何类型的CPU”的担忧变得无关紧要)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接