我正在对STM32F051的闪存进行优化。结果表明,float
和int
类型之间的转换会消耗大量闪存。
深入研究发现,转换为int
大约需要200字节的闪存;而到unsigned int
的转换大约需要 1500 个字节!
众所周知,int
和unsigned int
的区别仅在于对“符号”位的解释,因此这种行为对我来说是一个很大的谜。
注意:执行两阶段转换float
-> int
-> unsigned int
也仅消耗大约200个字节。
分析,我有这样的问题:
1)float
到unsigned int
转换的机制是什么。为什么同时转换float
-> int
-> unsigned int
仅占用很少的内存,为什么要占用这么多的内存空间?也许它符合IEEE 754标准?
2)使用转换float
-> int
-> unsigned int
而不是直接float
-> int
时是否会出现任何问题? ?
3)是否有任何方法可以包装float
-> unsigned int
转换,从而保持较低的内存占用?
注意:此处已经问过一个熟悉的问题(Trying to understand how the casting/conversion is done by compiler,e.g., when cast from float to int),但是仍然没有明确的答案,我的问题是关于内存使用情况。
float
-> int
(约200字节闪存)
int main() {
volatile float f;
volatile int i;
i = f;
return 0;
}
float
-> unsigned int
(〜1500字节的闪存!)
int main() {
volatile float f;
volatile unsigned int ui;
ui = f;
return 0;
}
float
-> int
-> unsigned int
(约200字节闪存)
int main() {
volatile float f;
volatile int i;
volatile unsigned int ui;
i = f;
ui = i;
return 0;
}
答案 0 :(得分:1)
从根本上讲,从float
到unsigned int
的转换不应大于从float
到signed int
的转换,实际上float
到unsigned int
到float
的转换可以更小。
我使用GNU Arm嵌入式工具链(版本7-2018-q2)和 据我所见,大小问题是由于gcc运行时库中的缺陷引起的。由于某种原因,该库未为Arm V6m提供__aeabi_f2uiz函数的专用版本,而是使用了更大的常规版本。