所以我正在研究内存受限的嵌入式系统,并希望尽可能多地节省字节数。如果,在我的代码中,如果我有如下语句:
b = a << 1;
或
b += 1;
其中 a
和 b
是 uint8_t
。将文字类型转换为相同类型是否有益,还是由编译器完成:
b = a << (uint8_t) 1;
b += (uint8_t) 1;
最佳答案
is it beneficial to tye cast the literal to same type or is it done by compiler:
关于编译器如何将常量值存储在它创建的二进制文件中,您受制于编译器。没有特别的理由认为像您建议的强制转换会改变使用的表示形式,因为它们名义上表示 runtime 转换(在这种情况下来自 int
)。此外,无需详细说明,C 指定算术运算的操作数将提升为至少与 int
一样宽的类型,以便计算算术运算的结果。编译器可能会合理地预先计算此类转换,从而有效地使您的转换完全无效。
但是,如果强制转换碰巧阻止了编译器识别完全避免存储常量值的机会,那么您的强制转换实际上可能更糟。例如,推测一下,如果您的 objective-c PU 有一条特定指令来将寄存器的值恰好递增 1,那么它可能会使用该指令来实现
b += 1;
...但没有意识到它可以用
做同样的事情b += (uint8_t) 1;
...因为 (uint8_t) 1
是非主要表达式。
谨慎使用强制转换,仅在需要描述程序的语义 时使用。依靠您的编译器来做好工作,如果没有,那就寻找更好的编译器。通常可以依赖嵌入式环境的编译器来理解最小化代码大小的重要性,甚至通用平台的编译器通常也可以选择请求优化最小代码大小。
关于c++ - 键入强制转换文字有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48689515/