【问题标题】:C++ statically allocated double ended queue implementationC++静态分配双端队列实现
【发布时间】:2025-12-05 04:25:01
【问题描述】:

STL有deque implementation,Boost deque implementation;但是它们都使用了序列容器的STL方式(使用分配器进行动态分配)。

我正在寻找一种可靠、快速且静态分配的双端队列实现。看起来像这样:

template<typename T, unsigned int S>
class StaticDeque
{
   T m_elements[S];
};

所以所有元素都是静态分配的。

注意 1:我已经有了基于 STL 的解决方案(使用自定义分配器为向量和双端队列静态分配数据),但我正在寻找更好的解决方案(执行时间更短)。

注意2:我需要静态分配的内存,因为我在内存中的预定义(快速访问)区域中处理数据。所以对象会这样声明:#pragma DATA_SECTION("fast_memory")StaticDeque&lt;int, 10&gt; payloads;

【问题讨论】:

  • 那么你的问题是什么?基本上,您需要一个带有两个索引的循环缓冲区来标记队列的当前末端。
  • deque需要多线程访问吗?
  • 您可以轻松地使用 put front 和 put back 功能制作自己的环形缓冲区。 stl deque 有很多开销来处理动态链表。
  • this questionkfifo.h。典型模板库的设计目标并不总是适合 嵌入式 应用程序。见STL+embedded。这并不意味着您不能在嵌入式环境中使用 C++。就像在嵌入式 C 情况下使用 C X11 图形库并不总是明智的,并非所有 C++ 代码都适合。
  • 仅供参考 Boost.Fusion deque 可能不是你想要的。 Boost.Container deque 相当于提升。

标签: c++ templates stl embedded containers


【解决方案1】:

您可以使用 Howard Hinnant 的 stack allocator,它通过 modified allocator 重用现有的 std::deque 实现。您可以为分配器的构造函数提供任何内存,包括一个所谓的 arena 对象,它在堆栈上保存一个字符数组。您还可以通过对 arena 类进行少量修改来使用包含堆上静态分配的内存的 arena 对象。

但是请注意,目前它不是 100% 静态方案,因为当 arena 对象持有的内存量耗尽时,将调用 ::operator new 以在堆上分配额外的内存。也许在具有运行时大小的数组的 C++14 中,这可以得到缓解。目前,只需确保为您的std::deque 预先分配和保留足够的内存(基于分析您的应用程序)。

优点是您可以将此分配器与任何 STL 容器一起使用,并且您可以只专注于内存问题,而不必担心让容器正确和高效。

【讨论】: