2010-05-21 109 views
3

我想在堆栈上分配内存。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”的解决方案。 另外,我想使注释掉的宏能够工作,但由于某些原因,我无法工作。

+1

“it's”=>“其” – 2010-05-21 14:33:17

+0

注意:“__asm int 3h”用于那些要调试的人,用Olly-Debugger说...在那里你可以看到堆栈“非常明确”。 – Poni 2010-05-21 14:35:03

+0

哈哈康拉德 - 嗯,大家 - 请不要复习/提高我的语法技能,因为我已经放弃了他们(: – Poni 2010-05-21 14:36:31

回答

8

对不起,但你最好使用alloca而不是做那种东西。不仅它是x86特定的,而且如果在优化上进行编译,它可能会带来意想不到的结果。

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

+0

通过确认,我也没有使用不支持'alloca'的编译器,有些拼写有所不同,但这可以用'#define'解决。 (也就是说,虽然我使用了一些编译器,但我当然没有使用过每一个可用的编译器。) – 2010-05-21 23:37:05

1

不要定义deallocate_from_stack。如实施,deallocate_from_stack将可能只会做你所期望的,如果立即allocate_from_stack后,甚至可能不是那么。此外,堆叠分配的全部重点是避免必须致电free或任何等效物。

分配宏对我来说看起来不错,尽管正如其他人指出的那样,它只能在x86上工作(这让您对“任何类型的CPU”没有任何疑问)。

3

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