【问题标题】:Should I use an unsigned char instead of an int to store values that will never be greater than 255? [closed]我应该使用 unsigned char 而不是 int 来存储永远不会大于 255 的值吗? [关闭]
【发布时间】:2018-06-23 03:28:17
【问题描述】:

在我为好玩而编写的 C++ 程序中,经常使用绝对不会大于 255 的数值,因此我将它们存储为无符号字符以节省使用的内存(因为无符号字符仅使用byte,而不是 int 的 4 个字节)。这是一个好主意吗?这样做有什么缺点吗?

我感谢任何人都可以提供的提示和见解。

【问题讨论】:

  • “这样做有什么缺点吗?”是的,如果有的话,您可能会节省很少的钱,但程序的运行速度可能会慢得多。
  • 这完全是一个基于意见的问题。但是这样做会失去严格别名的好处,这可能会损害您的执行速度。除此之外,chars 在输入/输出设置中的行为会非常不同。如果节省的内存对您来说仍然值得,我会选择uint8_t 而不是unsigned char

标签: c++ char int


【解决方案1】:

这是一种权衡。

鉴于您使用unsigned char 表示不超过255 的非负(大概)值,您将节省存储特定值的内存使用量。

如果您的代码对这些unsigned char 进行算术运算,则这些值可能会隐式提升为int,使用ints 完成运算,然后将结果转换回。这与许多现实世界的机器没有直接与char 类型一起工作的机器寄存器,但确实具有针对更大的“本机”整数类型(即int)优化的寄存器和指令这一事实一致。这种来回转换可能意味着在unsigned chars 上执行一系列操作的代码的速度可能比使用int 类型变量的编码速度要低得多。 (理论上,如果分析表明一系列操作的可观察结果没有变化,则实现可能会“优化”这种来回转换,但这不是必需的)

一般来说,对于表示数值,我建议不要使用unsigned char,而是默认使用int(或者如果您需要表示的值的范围超出@987654332 的范围,则使用另一种合适的整数类型@ 保证能够代表)。首先让代码工作,如果您决定优化代码以节省内存,请在代表性目标系统上进行测试/分析以确定使用unsigned char 的任何性能影响程度。如果使用 C++11 或更高版本,您还可以考虑使用 uint8_t(在支持它的实现上),但请记住,也可能有类似的权衡。

【讨论】:

    【解决方案2】:

    实际上并没有任何缺点,但由于填充字节,您可能不会使用更少的内存,具体取决于成员变量定义的顺序(这仅适用于类)。

    【讨论】:

    • 不,它不仅适用于类,当您声明范围变量时,它们也会填充。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多