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

4

3 回答 3

8

抱歉,但你最好使用 alloca 而不是做那种事情。它不仅是 x86 特定的,而且如果在优化的情况下编译,它可能会产生意想不到的结果。

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

于 2010-05-21T14:39:24.920 回答
3

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

于 2010-05-21T15:00:12.373 回答
1

不要定义deallocate_from_stack. 实施后,如果在 之后立即deallocate_from_stack调用,可能只会执行您期望的操作,甚至可能不会。另外,堆栈分配的全部目的是避免调用或任何等效项。allocate_from_stackfree

allocate 宏对我来说看起来不错,尽管正如其他人所指出的那样,它仅适用于 x86(这使您对“任何类型的 CPU”的担忧没有实际意义)。

于 2010-05-21T14:43:37.533 回答