在对内存非常敏感的嵌入式应用程序中,我注意到一些newlib函数使用了大量堆栈空间。通过查看newlib的源代码,特别是本例中的mem.c,我注意到了两个定义,PREFER_SIZE_OVER_SPEED和__OPTIMIZE_SIZE__,它们可以极大地减少内存使用。据我所知,这些都应该在编译newlib时定义,以便使用“针对大小进行优化”的库。由于我使用的是cortex-M3微控制器,有没有ARM工具链可以使用“针对大小进行了优化”的新库,或者提供使用它的选项,或者我应该尝试自己构建它。此外,在构建新的库时,我是否也应该构建GCC,或者我是否可以只构建库并使用我当前的工具链。目前,我正在使用CoIDE和他们提供的工具链。
发布于 2012-03-03 07:15:05
你只需要构建这个库,而不是编译器。
然而,我希望任何大小优化都与代码大小相关,而不是堆栈大小。只有当自动变量的大小或数量减少时,堆栈大小才会减少,这通常是由所需的功能决定的,而不是算法的优化。
发布于 2012-03-04 04:10:43
您使用的memmem不是标准函数。它是glibc中的GNU扩展。您实际运行的代码在str-two-way.h中。我没有研究它,但它说它是一个像Boyer-Moore一样的亚线性字符串搜索,并将您指向关于Boyer-Moore的维基百科文章。当然,这会产生一些内存成本。
因为它甚至不是一个标准函数,所以如果您不喜欢newlib的实现,就没有理由使用它。只需使用您自己的子字符串搜索函数。如果你知道二次时间足够好,只需在你自己的代码中使用mem.c中的5行循环即可。您可能希望检查memcmp是否正确地执行了wrt未对齐加载(如果您的体系结构支持这些加载)。如果没有,手动嵌套循环可能比调用memcmp更快。
https://stackoverflow.com/questions/9536403
复制相似问题