【问题标题】:Hinnant's short_alloc only on stackHinnant 的 short_alloc 仅在堆栈上
【发布时间】:2019-06-02 19:07:27
【问题描述】:

我正在尝试使用 Hinnant 的 short_alloc 在堆栈上分配向量, 我正在尝试完全删除堆分配。现在出现了开发人员使用超出向量大小的 push_back 的问题。我正在考虑覆盖 push_back 函数,以便它检查是否达到容量,如果是,那么它将断言错误。据了解,STL 函数并不意味着被覆盖,什么是更好的实现方法。

【问题讨论】:

标签: c++ c++11 memory-management


【解决方案1】:

首先,您不需要继承任何东西来覆盖任何东西。分配器可以在allocate 函数中抛出异常。毕竟,它使用::operator new,如果它无法分配内存,它将抛出std::bad_alloc。在我的系统上是这样的:__throw_length_error("allocator<T>::allocate(size_t n) 'n' exceeds maximum supported size") 也是如此..

所以在你的 allocate 函数中,做:

throw std::bad_alloc();

仍然......我不清楚为什么有人想要在有数组时分配stack 分配std::vector.. 但这不关我的事。

【讨论】:

  • 数组不跟踪其中的实际元素
  • 我正在做一个 512KB - 1MB RAM 的嵌入式系统项目,我们不能使用动态内存分配,如果我想使用 STL 容器,那么在这种情况下只剩下数组。在寻找使用其他容器的方法时,我遇到了这个分配器,它正在寻找一种完全避免动态内存分配并尝试利用 STL 容器和算法的方法。
【解决方案2】:

我曾经是这个分配器的专家,但是,它确实需要你正确处理竞技场。

由于带有分配器的向量是与常规向量不同的类型,它与现有的 API 不兼容。相反,我最近切换到 boost 以获得相同的行为,但开销更少:

  • small_vector:类似于分配器
  • static_vector:只有栈部分

两个容器都包含类本身的竞技场,并且对复制和移动有很好的支持。

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2013-02-15
    • 2013-10-14
    • 2015-04-02
    • 2019-12-13
    • 2012-07-23
    • 2013-05-10
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多