如何解决为什么 Newlib C 标准库实现的 strtod() 和 strtof() 使用动态内存分配?
Newlib 是用于嵌入式系统的 C 标准库实现(主要受 BSD libc 的启发)。
显然,字符串到浮点转换函数(strtod
,strtof
)通过调用一个名为Balloc
的函数来使用动态内存分配,该函数调用_calloc_r
,后者调用{ {1}}。
为什么?
我在反汇编中找到了对 _malloc_r
的调用,并尝试了许多不同的输入(字符串)来尝试触发它被调用,但我没有设法调用它。 (我无法在 C 源代码中跟踪该程序,因为该库是经过大量优化预编译的(共享库)。)
我需要使用一个充满了对 _Balloc
和其他函数的调用的库,所以我不能轻易消除这些函数。
我在微控制器上没有堆,我不想在微控制器上有堆,我什至没有 strtod
函数(它最终负责从堆)为我实现...
我现在只有 _sbrk
的存根,如果它被调用就会触发硬故障,这样链接器就不会失败。但这显然不是很好。
所以我想知道为什么和何时(什么样的输入)会被调用 Balloc。 也许我可以证明在我的情况下这种类型的输入是不可能的,所以存根将是一个受制裁的黑客。
这里是 strtod.c:https://www.codepile.net/pile/JZVLj6yQ
编辑:
_strtod_l()(这是被 strtod 包裹的):
_sbrk
解决方法
为什么 Newlib C 标准库实现的 strtod() 和 strtof() 使用动态内存分配?
没有扫描代码的信仰飞跃:因为高质量的转换需要很多空间。
考虑 DBL_MIN
需要 hundreds of digits 转换为字符串完全。下一个最大值也需要类似数量的数字。 字符串 几乎正好在中间的一半需要检查这 100 位十进制数字,同时形成一个非常长的二进制形式,除了可能必须乘以的指数之外,以便返回 最佳 double
答案。代码根据其动态需求进行分配。
如果您对不太理想的转换感到满意,那么转换为 double
只需要几十个字节。
选择权衡:正确性、速度、大小。
,您或许可以制作更好的 _sbrk
假冒版本。我不是说这是最好的计划,但如果它有效......
给你的程序一个很好的全局 char heap[4096]
或任何适合的,和一个 char *heap_ptr
并让你的 _sbrk
函数使用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。