【问题标题】:Using C++11 with move semantics - without the standard library (and with Boost.smart_ptr)使用带有移动语义的 C++11 - 没有标准库(和 Boost.smart_ptr)
【发布时间】:2020-01-10 09:16:14
【问题描述】:

我正在从事嵌入式项目,使用 Zephyr RTOS 和 ARM 嵌入式微控制器,如 STM32 Nucleo 系列 (Cortex M4/0)。

最近,由于最近版本的 Zephyr 对 C++ 支持的显着改进,我正在考虑从 C 开发转向现代 C++。

默认情况下,Zephyr 包含 C 标准库,但不包含 Cpp 的 STD。

Zephyr 实际上添加了对 Cpp 标准库的可选支持,这似乎工作得很好。然而,它需要大量的闪存使用(我的微控制器闪存中接近 65%,没有我的代码!)。

所以我正在尝试寻找在没有实际标准库(包括内存/实用程序头文件)的情况下使用现代 C++ 的替代方法。

我考虑过将Boost.smart_ptr 用于智能指针,但我想知道我应该如何使用移动语义(std::move)。

我应该使用Boost.Move 模块吗?即使我使用的是 C++1x 而不是 C++0x?

我应该使用direct cast from T& to T&&自己实现移动语义吗?

【问题讨论】:

  • 您可以在一行中自己实现std::move...好吧,您也需要remove_reference,并且可能想要进行一些格式化。但是,如果您只需要标准库中的 std::move,那么就不会有任何问题。
  • Boost(以及几乎所有 CPP 代码)依赖于 STD,即包括 std 标头。
  • 我宁愿避免 STD、异常和 RTTI
  • @IgorR。如果我没记错的话,如果不包含 STD 标头,Boost 在其内部实现中会有回退。我已经成功地在没有 STD 的情况下使用 Boost.DI,也会尝试 smart_ptr & move 但我注意到它们在源代码中也有后备......
  • @P__J__ 当然,我会避免任何反嵌入式机制,例如异常和 RTTI。但智能指针似乎对我的需求很有价值,所以我宁愿不放弃。

标签: c++11 move-semantics boost-smart-ptr zephyr-rtos boost-move


【解决方案1】:

我刚刚找到了导致 STD 大量使用闪存的原因。

在我的例子中,它包含了<iostream> 标头(用于std::cout),没有它,flash 的使用就足够合理了,即使是标准容器也是如此。

所以我想它解决了我的问题,我现在可以使用 C++ STD 来达到我的目的。

(无论如何,在嵌入式环境中使用<iostream> is a bad idea,打印只需使用printf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多