我想在堆栈上分配内存。
听说_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”的解决方案。 此外,我想使注释掉的宏工作,但由于某种原因,我不能。
答案 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”都没有用)。