gpt4 book ai didi

用于嵌入式系统的 C++ 数据容器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:09 24 4
gpt4 key购买 nike

我使用嵌入式系统。通常这意味着我有一个小型微 Controller ,具有 64 - 512 KB 的 RAM 和 128 - 1024 KB 的闪存,如 STM32。我更喜欢使用 C++ 对此类系统进行编程。但我还没有找到可接受的方式来处理常见的数据结构,如堆栈、队列、映射等。

当然,STL 拥有所有这些和许多其他方便的东西,但大多数 STL 容器需要支持异常和动态内存分配,这在嵌入式编程中通常是不受欢迎的。

我知道我们可以通过使用自定义分配器来避免这个问题,我们可以从静态对象池或类似的东西分配内存。然而,我看到的主要问题是,当没有足够的分配空间来将新元素插入容器时,我们无法可靠地处理这种情况。 STL 和我遇到的其他类似 STL 的库只提出了两个选项:

  • 断言。这意味着当分配的空间不足时系统会失败。
  • 回调。好一点,但对我来说仍然不方便。

    q.push(newElem); /* fails or just calls predefined callback
    * when not enough space in queue.
    */

也许我错了。但在我看来,最好的方法是返回状态以通知调用者它没有足够的内存用于容器中的新元素。我想自己决定如何处理该错误。例如,我想删除新元素,向调试日志发送一条消息并恢复正常的程序流程。从我的角度来看,它看起来更可靠。

换句话说,我想要这样的东西:

queue<uint32_t, 128> q;
// some code ...
queue::status sts = q.push(newElem);
if (sts != queue::OK)
LOG("Not enough space in queue\r\n");

// continue normal program execution ...

有人建议如何处理那件事吗?

最佳答案

您可以使用一个自定义分配器,它在空间不足时抛出 std::bad_alloc,然后在您的代码中包装依赖于异常处理 block 中插入成功的部分,并在 catch 子句中处理分配失败.

std::queue <message> Queue;

try
{
Queue.insert (message {"hello world"});
}
catch (std::bad_alloc const & Error)
{
LOG (Error.what ());
}

对于简单的场景,这有点冗长,小心(使用 RAII)它可以成为一个强大的工具。此外,如果您分配了这些简单的场景,则可以将此模式隐藏在模板中。

template <typename fn>
void log_failure_and_contiue (fn Fn)
{
try
{
Fn ();
}
catch (std::bad_alloc const & Error)
{
LOG (Error.what ());
}
}

std::queue <message> Queue;

log_failure_and_continue ([&] {
Queue.insert ({ "Hello World!" });
});

从性能的角度来看,大多数编译器都实现了零成本异常处理,因此只有在抛出异常时才会受到影响,我认为在这种情况下这种情况应该很少见。

关于用于嵌入式系统的 C++ 数据容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46934622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com