c++ - 键入强制转换文字有意义吗?

标签 c++ c embedded

所以我正在研究内存受限的嵌入式系统,并希望尽可能多地节省字节数。如果,在我的代码中,如果我有如下语句:

b = a << 1;

b += 1;

其中 abuint8_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/

相关文章:

c - 如何使用 jansson 从 json 数组中提取无键值

c - 使用 malloc 和 realloc 从输入文件到数组

C "Generic"结构构建

c - Omap 5912 的 IDE 和开发工具

c++ - 在这种情况下谁应该构建对象?

c++ - 关于 pthread_exit 释放自动变量的混淆

c++ - 一行类定义?

c++ - 命名 RVO 的可能性?

embedded - STM32引导加载程序不工作

使用 if 语句进行编译时配置