因此,我正在内存受限的嵌入式系统上工作,并希望保存尽可能多的字节。如果在我的代码中是否有类似以下语句:
b = a << 1;
或者
b += 1;
其中
a
和b
是uint8_t
。将文字类型强制转换为相同类型是否有益,还是由编译器完成:b = a << (uint8_t) 1;
b += (uint8_t) 1;
最佳答案
关于如何将常量值存储在其创建的二进制文件中,您受编译器的摆布。没有特别的理由认为您建议的强制类型转换将更改所使用的表示形式,因为它们名义上表示运行时转换(在这种情况下为int
)。而且,在不赘述的情况下,C指定为了计算算术运算的结果,将把算术运算的操作数提升为至少与int
一样宽的类型。编译器可能合理地预先计算了这种转换,从而完全使您的转换完全无效。
但是,如果强制转换可能会阻止编译器发现机会避免完全存储恒定值,则强制转换实际上可能会更糟。例如,以推测的方式,如果 objective-c PU有一条特定指令将寄存器的值加正1,则它可能会使用该指令来实现
b += 1;
...但是无法意识到它可以做同样的事情
b += (uint8_t) 1;
...因为
(uint8_t) 1
是非主要表达式。谨慎使用强制类型转换,并且仅在描述程序语义时必要时使用。依靠您的编译器来做好,如果没有,那就寻找更好的编译器。通常可以依靠嵌入式环境的编译器来了解最小化代码大小的重要性,即使是通用平台的编译器也经常有选项要求最小化代码大小的优化。