11

我有两个问题:

1) 是否可以实现一个分配器,它使用 alloca 在堆栈上分配内存,否则是否符合 C++ STL?

如果那里有代码,您只需将我指向 URL 即可让我高兴。:-) 如果那里没有代码,也许您可​​以绘制函数分配和解除分配?

2)如果上述问题的答案是“是”,我想了解如何在堆栈上为类成员分配内存。例如,考虑一个

std::vector<int, AllocaAllocator<int> > 

并假设调用此向量的成员函数“resize”首先调用分配器的“deallocate”,然后调用“allocate”。

调用 allocate 的范围是成员函数 resize 的范围。这是否意味着在该函数调用结束时从堆栈中删除分配的内存?

亲切的问候,比约恩

4

2 回答 2

6

Bjoern,您似乎从根本上误解了 stack 和 alloca 的工作原理。阅读有关它们的信息。

您要问的是不可能的,因为当您从分配它的函数返回时, alloca 分配的内存被“释放”(并且与 Patrick 所说的不同,内联不能改变其行为)。我写“freed”是因为它实际上并没有被释放,它只是像任何其他堆栈变量一样超出了范围。因此,之后使用它会导致未定义的行为。

假设您分配了一块内存,YourAllocator::allocate其中调用 from d.push_back()

deque<int, AllocaAllocator> d;
d.push_back(42); // calls alloca
printf("Hello\n");
printf("%d\n", d[0]);

push_backalloca 分配的内存可能会被and的堆栈帧覆盖printf,因此输出可能不是 42,它可能会崩溃或其他任何事情。

于 2010-11-26T17:55:55.973 回答
3

不,这种事情是不可能的。首先,STL 希望分配更多内存,然后释放旧内存。你将如何在堆栈上做到这一点?

唯一与此相当的东西是保守的垃圾收集器。

于 2010-12-14T20:12:29.740 回答