【问题标题】:Is there an allocator that uses alloca and is otherwise C++ STL compliant?是否有一个使用 alloca 并且符合 C++ STL 的分配器?
【发布时间】:2011-05-04 05:02:01
【问题描述】:

我有两个问题:

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

如果那里有代码,您只需将我指向 URL 即可让我开心。 :-) 如果没有代码,也许你可以画出函数分配和释放?

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

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

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

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

亲切的问候, 比约恩

【问题讨论】:

  • 你不能通过alloca释放你在堆栈上分配的空间。获取 alloca 分配的内存的唯一方法是退出函数。
  • 这是否意味着,如果您退出一个函数,那么所有通过 alloca 在堆栈上分配在该函数内的内存都会被释放?这是否意味着不可能使用 alloca 为类成员分配内存?那么,是不是就不可能写出使用alloca的分配器呢?
  • 请看一下这个问题:“寻找 C++ STL-like vector class but using stack storage”(stackoverflow.com/q/354442) 已经有一些关于该主题的有价值的 cmets。
  • 真正的问题是你为什么要这样做?

标签: c++ stl stack allocator alloca


【解决方案1】:

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

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

假设你在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,它可能会崩溃,或者其他任何事情。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • +1 表示“STL 希望分配更多内存,然后释放旧内存。你打算如何在堆栈上执行此操作?”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2014-09-26
    相关资源
    最近更新 更多