【问题标题】:Dynamic stack allocation in C++C++ 中的动态堆栈分配
【发布时间】:2010-05-21 14:30:36
【问题描述】:

我想在栈上分配内存。

听说过 _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...在那里你可以“非常清楚地”看到堆栈。
  • 哈哈 Konrad - 好吧,每个人 - 请不要复习/提高我的语法技能,因为我已经放弃了它们(:
  • 内联 x86 程序集比 alloca 更具体的编译器和平台。
  • 你试图通过强制从堆栈分配来解决什么实际问题?
  • @Johnsyweb:+1!哈哈! (:

标签: c++ stack allocation


【解决方案1】:

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

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

【讨论】:

  • 作为确认,我还没有使用不支持alloca 的编译器。有些拼写不同,但这可以使用#define 解决。 (也就是说,虽然我使用了许多编译器,但我肯定没有使用每一个可用的编译器。)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    不要定义deallocate_from_stack。在实现时,deallocate_from_stack 可能只会在allocate_from_stack 之后立即 调用你所期望的,甚至可能不会。另外,堆栈分配的重点是避免调用free 或任何等效项。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-14
      • 2019-05-17
      • 2010-10-30
      • 2012-03-02
      • 1970-01-01
      • 2023-04-02
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多