在我的嵌入式应用程序中,它对内存非常敏感,我注意到一些 newlib 函数使用了大量的堆栈空间。通过查看 newlib 的源代码,特别是本例中的 memmem.c,我注意到两个定义,PREFER_SIZE_OVER_SPEED 和 __OPTIMIZE_SIZE__,它们可以大大减少内存使用量。据我了解,这些应该在编译 newlib 以使用“优化大小”库时定义。由于我使用的是 cortex-M3 微控制器,是否有任何 ARM 工具链使用“优化大小”newlib 或提供使用它的选项,或者我应该尝试自己构建它。此外,在构建 newlib 时,我应该也构建 GCC 还是可以只构建库并将其与我当前的工具链一起使用。目前我正在使用 CoIDE 和他们提供的工具链。
问问题
1194 次
2 回答
1
您只需要构建库,而不是编译器。
但是,我希望任何大小优化都与代码大小而不是堆栈大小有关。只有减少自动变量的大小或数量,堆栈大小才会减少,通常这是由所需的功能而不是算法的优化决定的。
虽然确实可以通过使用更多内存来加速涉及大量数据移动的高级操作,但我想说这种机会在 C 标准库级别上是最小的,因此“更喜欢大小而不是速度”都是关于代码大小而不是数据内存使用情况。
于 2012-03-02T23:15:04.820 回答
0
您使用的 memmem 不是标准功能。它是 glibc 中的 GNU 扩展。您实际运行的代码位于 str-two-way.h 中。我没有研究它,但它说它是像 Boyer-Moore 一样的亚线性字符串搜索,并为您指出有关 Boyer-Moore 的维基百科文章。当然,这会产生一些内存成本。
由于它甚至不是标准函数,如果你不喜欢它,没有理由使用 newlib 的实现。只需使用您自己的子字符串搜索功能。如果您知道二次时间足够好,只需在您自己的代码中使用 memmem.c 中的 5 行循环。您可能想检查 memcmp 在未对齐的负载方面是否正确(如果您的架构支持这些)。如果没有,手动嵌套循环可能比调用 memcmp 更快。
于 2012-03-03T20:10:43.277 回答