我有两个问题:
1)是否可以实现一个使用alloca在堆栈上分配内存的分配器,否则符合C ++ STL?
如果那里有代码,只需将我指向URL即可让我高兴。 :-) 如果那里没有代码,也许你可以草拟函数allocate和deallocate?
2)如果对上述问题的回答为“是”,我想了解如何为类成员在堆栈上分配内存。例如,考虑一下
std::vector<int, AllocaAllocator<int> >
并且假设对该向量的成员函数'resize'的调用首先调用'deallocate'然后'分配'分配器。
调用allocate的范围是成员函数resize的范围。这是不是意味着在该函数调用结束时从堆栈中删除了分配的内存?
亲切的问候, 比约恩
答案 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_back
和printf
的堆栈帧覆盖,因此输出可能不是42,可能会崩溃,或者其他任何东西。
答案 1 :(得分:3)
不,这种事情是不可能的。首先,STL期望分配更多内存,然后释放旧内存。你打算怎么在堆栈上做到这一点?
唯一远远相当于此的是保守的垃圾收集器。