是否有使用alloca的分配器,否则符合C ++ STL?

时间:2010-11-02 22:09:04

标签: c++ stl stack allocator alloca

我有两个问题:

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

如果那里有代码,只需将我指向URL即可让我高兴。 :-) 如果那里没有代码,也许你可以草拟函数allocate和deallocate?

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

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

并且假设对该向量的成员函数'resize'的调用首先调用'deallocate'然后'分配'分配器。

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

亲切的问候, 比约恩

2 个答案:

答案 0 :(得分:5)

Bjoern,看起来你从根本上误解了堆栈和alloca是如何工作的。了解他们。

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

假设您在YourAllocator::allocate中分配了一块从d.push_back()调用的内存:

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

alloca分配的内存可能被push_backprintf的堆栈帧覆盖,因此输出可能不是42,可能会崩溃,或者其他任何东西。

答案 1 :(得分:3)

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

唯一远远相当于此的是保守的垃圾收集器。