C++静态分配双端队列实现

标签 c++ templates stl embedded containers

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

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

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

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

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

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

最佳答案

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

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

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

关于C++静态分配双端队列实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16134057/

相关文章:

c++ - 作为引用传递时 istream 的无效初始化错误

c++ - 为什么 C++ 中没有基类?

c++ - 为什么 STL 容器使用复制来填充调整大小?

c++ - 有什么方法/技巧可以将 std::set 传递给需要 C 数组的 C API?

c++ - 构造调用顺序 (C++)

C++ 装饰设计模式 - 代码有效但不知道为什么

templates - FOSUserBundle:如何最好地将登录和注册表单集成到一个模板中?

c++模板化 map ,不同类型参数的通用接口(interface)

php - Twig在模板生成后添加内容

c++ - 无法删除 std::vector & std::array?