为什么 Newlib C 标准库实现的 strtod() 和 strtof() 使用动态内存分配?

问题描述

Newlib 是用于嵌入式系统的 C 标准库实现(主要受 BSD libc 的启发)。

显然,字符串到浮点转换函数strtodstrtof)通过调用一个名为Balloc函数来使用动态内存分配,该函数调用_calloc_r,后者调用{ {1}}。

为什么?

我试图查看可用的源代码 online,但我无法理解。

我在反汇编中找到了对 _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 函数使用它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...