ARM GCC编译器“;童车;转换 问题

ARM GCC编译器“;童车;转换 问题,gcc,memory,compiler-construction,unsigned,stm32f0,Gcc,Memory,Compiler Construction,Unsigned,Stm32f0,我正在使用STM32F051的闪存优化。据透露,float和int类型之间的转换会消耗大量闪存 深入研究后发现,到int的转换需要大约200字节的闪存;而转换为无符号int大约需要1500字节 众所周知,int和unsigned int的区别仅仅在于对“符号”位的解释,因此这种行为对我来说是一个巨大的谜 注意:执行两级转换float->int->无符号int也仅消耗约200字节 问题 分析这一点,我有这样的问题: 1) 将float转换为unsigned int的机制是什么。为什么它需要这么多的

我正在使用STM32F051的闪存优化。据透露,
float
int
类型之间的转换会消耗大量闪存

深入研究后发现,到
int
的转换需要大约200字节的闪存;而转换为
无符号int
大约需要1500字节

众所周知,
int
unsigned int
的区别仅仅在于对“符号”位的解释,因此这种行为对我来说是一个巨大的谜

注意:执行两级转换
float
->
int
->
无符号int
也仅消耗约200字节

问题 分析这一点,我有这样的问题:

1) 将
float
转换为
unsigned int
的机制是什么。为什么它需要这么多的内存空间,而在同一时间转换
float
->
int
->
无符号int
占用这么少的内存?也许它与IEEE 754标准有关

2) 当使用转换
浮点
->
整数
->
无符号整数
代替直接的
浮点
->
整数
时,是否会出现任何问题

3) 是否有任何方法可以包装
浮点
->
无符号整数
转换以保持较低的内存占用

注意:这里已经提出了熟悉的问题(),但仍然没有明确的答案,我的问题是关于内存使用的


技术数据
  • 编译器:ARM-NONE-EABI-GCC(GCC版本4.9.3 20141119(发布))
  • MCU:STM32F051
  • MCU核心:32位ARM CORTEX-M0
代码示例
  • float
    ->
    int
    (~200字节的闪存)

  • float
    ->
    unsigned int
    (~1500字节的闪存)

  • float
    ->
    int
    ->
    unsigned int
    (~200字节闪存)


  • float
    unsigned int
    的转换应该大于从
    float
    signed int
    的转换,这没有根本原因,实际上,
    float
    unsigned int
    的转换可以小于
    float
    signed int
    的转换

    我使用GNU Arm嵌入式工具链(版本7-2018-q2)和
    据我所知,大小问题是由于gcc运行库中的一个缺陷造成的。出于某种原因,该库没有为Arm V6m提供专门版本的_aeabi_f2uiz函数,而是采用了更大的通用版本

    谢谢,这给了我一些线索。注意,我已在禁用优化的情况下进行了所有闪存大小测量。@drkr在我的回答中使用“优化”与编译代码时使用的编译器设置无关,而是与编译器运行库的内容有关。我把答案改为“专业化”。我认为这更正确,更少误导。@drkr即使在这种情况下,答案似乎是一样的,未优化代码的质量也不值得担心,您应该只关心优化代码的质量(大小、性能等等)。
    int main() {
    volatile float f;
    volatile int i;
    i = f;
    return 0;
    }
    
    int main() {
    volatile float f;
    volatile unsigned int ui;
    ui = f;
    return 0;
    }
    
    int main() {
    volatile float f;
    volatile int i;
    volatile unsigned int ui;
    i = f;    
    ui = i;
    return 0;
    }