嵌入式环境中的STL

2023-11-27

我是一名 C++ 程序员,多年来一直听到这样的说法:STL 是not good用于嵌入式环境,因此通常禁止在基于嵌入式环境的项目中使用。我相信像 Boost 这样的 STL 库要强大​​得多,并且提供更快、更少出错的开发方式(当然,语法有点吓人,但一旦过去了)我认为这是一个真正的宝藏)。此外,我发现关于 STL 很重并且增加了代码的最终占用空间的说法是荒谬的,因为由于它是模板化的,所以人们只能得到他要求的可编译代码,而不是整个 STL。

我的问题是,这种称为 STL 的民粹主义(至少我周围的大多数人都这么认为)的原因是什么?not对于嵌入式环境?

我确实看到了一个类似性质的问题,但在这里我希望有人帮助指出 STL 和嵌入式环境的一般优缺点。

编辑:所以在这里我将在回复到来时将要点加起来:
1. 可移植性问题
2.通过STL容器应对巨大的动态分配
3.STL很难调试
4. STL 中的深度函数调用会导致内联能力弱的编译器性能低下(函子的力量毫无用处!)


STL 有很多问题(如此处所述EASTL),在嵌入式系统或小规模系统上,主要问题通常是它管理内存的方式。一个很好的例子是Aquaria 的 PSP 端口.

我的建议是在遵循假设之前进行第一次测试,如果测试显示您使用了太多的空间/处理器周期,那么也许一两个优化可以将其推入“可用”领域。

最后,boost 是基于模板的,所以如果你查看生成的模板代码的大小,它会受到与 STL 相同的影响。

编辑/更新:

为了澄清我最后的陈述(这只是指 boost VS STL)。在 C 中,您可以(ab)使用相同的代码在共享相同标头(或布局)的不同结构上执行相同的工作,但使用模板,每种类型可能会获得自己的副本(我从未测试过是否有任何编译器如果启用了“优化尺寸”,则足够聪明来执行此操作),即使它与刚刚生成的完全相同(在机器/装配级别)。 boost 的优点是读起来更干净,并且里面塞满了更多的东西,但是由于大量(有时很大)的标头,这可能会导致编译时间很长。 STL 的好处是因为您可以传递您的项目而不需要下载/附带 boost。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式环境中的STL 的相关文章

随机推荐

  • PHP 获取静态方法

    我想通过 var 调用类方法 如下所示 var read params array some parameter if MyClass has the static method var echo MyClass var params el
  • Zod Schema Validation 中至少一个/最少一个字段

    我已经使用 JOI 实现了此代码 其中用户必须发送 userId 和正文中的至少一个键 如何使用 ZOD 实现相同的功能 params Joi object keys userId Joi required custom objectId
  • 浅拷贝还是深拷贝?

    我对这两种将一个对象复制到另一个对象的方法有点陌生 我很困惑 无法找出深层复制和浅层复制之间的主要区别 我已经了解了很多关于此的理论 但我需要用适当的例子进行解释 我有一个程序 可以将一个对象复制到另一个对象中 gt class A pub
  • 计算两个日期间隔之间每月的天数

    我有一组事件 每个事件都有开始日期和结束日期 但它们发生的时间跨度为几个月 我想创建一个表格来显示每个月此事件的天数 我有下面的例子 event start date lt as Date 23 10 2012 d m Y event en
  • 上下文版本冲突错误,Google colab

    我正在尝试在 Google colab 上安装并运行 sunpy 它需要 astropy 版本 3 1 或更高版本的软件包 即使在安装 astropy 版本 3 2 1 后 当我导入 sunpy 时 它也会出现以下错误 Contextual
  • Android Activity 的唯一 ID

    我需要获取 Android 活动实例的唯一 ID 我想获取activitymanager在日志中写入的字符串 例如 ActivityManager HistoryRecord的活动暂停超时 450495a0 但我不知道如何得到它 有人知道我
  • 如何从 PHP 压缩或转换为低质量 MP3 文件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何 PHP 库或函数可以将 MP3 文件转换为较低质量 我想通过 PHP 将 128Kbps 或更高质量的 MP3 文件压缩 转换为 64K
  • Javascript:console.log 到 html

    我想将 console log 输出写入 div 层 例如 document write console log 5 1 Incorrect random example 有人可以解决我的问题吗 谢谢 EDIT 我的意思是 例如 conso
  • Passport-local mongoose node.js 支持多种用户类型

    我想要两种类型的用户登录 用户 客户端 我到底如何在 app js 中为这两种类型创建 localStrategies 序列化和反序列化用户 我有两个单独的模式 都使用 PassportLocalMongoose 插件 我目前配置我的护照如
  • 在 Android 中按主页按钮后应用程序被杀死时未打开主活动

    在我的应用程序中 活动 A 是启动器活动 从 A 称为 B 从 B 称为 C 我有超过 5 个活动 在 C 中 当我按下主页按钮 并再次打开我的应用程序时 它会打开 C 这对我来说没问题 但是在按下 C 中的主页按钮后 当它空闲一段时间并且
  • System.exit(0) 没有关闭我的所有活动? [复制]

    这个问题在这里已经有答案了 我有 2 个活动 因此活动 1 转到活动 2 然后在活动 2 上我有一个退出按钮 但是当我点击它时 它只退出了活动2并再次返回到活动1 基本上感觉就像我刚刚再次启动应用程序一样 我不知道为什么 这是我的代码 Bu
  • 在两个 WAR 之间共享应用程序上下文?

    有没有办法在两个部署的战争之间共享应用程序上下文 一场战争需要连接另一场战争的服务 我不知道从哪里开始 我们的团队有相同的要求 在 Tomcat 中的多个 WAR 之间共享 Spring bean 老实说 诸如 不要这样做 之类的答案没有帮
  • 张量流:使用队列运行器有效地馈送评估/训练数据

    我正在尝试运行张量流图来训练模型并使用单独的评估数据集定期进行评估 训练和评估数据都是使用队列运行器实现的 我当前的解决方案是在同一个图中创建两个输入并使用tf cond依赖于一个is training占位符 我的问题通过以下代码突出显示
  • 如何从命令提示符使用 mysqldump 添加日期和时间以及备份文件名称并定义备份文件的路径

    我使用此命令从 mysqldump 进行备份 mysqldump uroot ptrackerdb alldatabases gt test sql 现在我想用我的备份文件添加日期时间 例如当前日期和时间 例如 test 25July201
  • 常见的 Haskell 运算符有可发音的名称吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我正在阅读为大善而学 Haskell 而且我从来不知道 Haskell 运算符
  • ElementClickInterceptedException:消息:元素单击被拦截:元素

    我试图单击 所有主题 和 所有状态 复选框 然后搜索结果 当我运行脚本时 会打开一个大小为 1036x674 的 Chrome 窗口 如果我不理会窗口 则会出现元素单击拦截错误 如果我最小化或最大化窗口 我的脚本就可以正常工作 我正在使用
  • 如何在 python 中的活动连接上启动 TLS?

    以下是我当前在端口 587 上连接到 gmail 的 smtp 服务器的代码 发出 STARTTLS 命令后 我如何完成 TLS 会话协商并开始发出 AUTH LOGIN 和 MAIL FROM 等命令 我省略了 Base64 编码的 gm
  • TestCoroutineDispatcher 和 TestCoroutineScope 均不处理协程测试异常

    使用这个manual测试协程 编写预期抛出异常的测试会导致崩溃 而不是通过测试 我想知道我做错了什么 private val testDispatcher TestCoroutineDispatcher Before fun setup p
  • Python 中的区域交集

    我有一个代码 它采用条件 C 作为输入 并将问题的解决方案计算为 x y 空间上的 允许区域 A 该区域由多个 管 组成 这些 管 由两条永远不会交叉的线定义 我要寻找的最终结果必须满足 k 个条件 C1 Ck 因此是 k 个区域 A1 A
  • 嵌入式环境中的STL

    我是一名 C 程序员 多年来一直听到这样的说法 STL 是not good用于嵌入式环境 因此通常禁止在基于嵌入式环境的项目中使用 我相信像 Boost 这样的 STL 库要强大 得多 并且提供更快 更少出错的开发方式 当然 语法有点吓人