何时使用`short` over`int`?

day*_*oli 28 c++ int short

有迹象表明询问的区别许多问题short,并int在C++整数类型,但实际上,当你选择shortint

day*_*oli 36

(有关更详细的解释,请参阅Eric的答案)

笔记:

  • 通常,int设置为"自然大小" - 硬件最有效处理的整数形式
  • short在数组或算术运算中使用时,short整数被转换为int,因此这可以引入处理short整数的速度命中
  • 使用short可以节省内存,如果它比较窄int,这在使用大型数组时很重要
  • 你的程序将在一个32位的使用更多的内存int系统相比,16位int系统

结论:

  • 使用int除非您保留内存是至关重要的,否则您的程序会占用大量内存(例如,许多阵列).在那种情况下,使用short.

  • 注意:*不保证*"short"实际上使用的内存少于`int`,它是实现定义的. (11认同)
  • 零/符号扩展并不**那么**昂贵。我不介意性能受到太大影响。一旦存储了大量数字,请选择最紧密配合的类型以节省内存,从而提高缓存局部性。减少缓存未命中次数通常比从“short”扩展到“int”的成本更重要。 (2认同)

Eri*_*inn 17

short在以下int时间选择:

  • 您希望减少要存储的值的内存占用量(例如,如果您的目标是低内存平台),
  • 您希望通过增加可以打包到单个内存页面中的值的数量(减少访问值时的页面错误)和/或内存缓存(减少访问值时的缓存未命中)来提高性能,并且分析已显示这里有性能提升,
  • 或者您通过网络发送数据或将数据存储到磁盘,并希望减少占用空间(占用更少的磁盘空间或网络带宽).虽然对于这些情况,您应该更喜欢以比特而不是int或者指定大小的类型short,这可以根据平台而变化(因为您希望具有32位的平台short能够读取在平台上写入的文件16位short).好的候选者是stdint.h中定义的类型.

和:

  • 您有一个数值,不需要short在目标平台上存储任何无法存储的值(对于16位short,这是-32768- 327670- 65535对于16位unsigned short).
  • 你的目标平台(或你一个R目标平台)使用了更少的内存short比的int.的标准只保证short不大于int,因此允许实现具有相同的尺寸要short和用于int.

注意:

chars也可以用作算术类型.回答"什么时候应该使用char,而不是shortint?" 会读得非常类似于这个,但是数字不同(-128- 127对于8位char,0- 255对于8位unsigned char)

实际上,您可能实际上并不想short特别使用该类型.如果你想要一个特定大小的整数,那么定义<cstdint>的类型应该是首选的,例如,int16_t每个系统上的16位将是16位,而你不能保证short你的代码在所有目标中的大小相同将编译为.


Tho*_*ews 8

一般情况下,你不喜欢shortint.

int类型是处理器的本机字大小
通常,a int是处理器的字大小.

例如,对于32位字长处理器,a int将是32位.处理器使用32位最有效.假设short是16位,处理器仍然从内存中取出32位.所以没有效率; 实际上它更长,因为处理器可能必须将位移位到32位字中的正确位置.

选择较小的数据类型 有长度特定于比特的标准化数据类型,例如uint16_t.这些比较模糊的类型char, short,int.这些特定于宽度的数据类型通常用于访问硬件或压缩空间(例如消息协议).

选择一个较小的范围内
short数据类型是基于范围没有被比特宽度.在32位的系统中,两个shortint可以具有相同的32位的长度.

一旦使用的原因short是因为该值永远不会超过给定范围.这通常是一个谬论,因为程序会改变,数据类型可能会溢出.

总结
目前,我不再使用short了.我uint16_t在访问16位硬件设备时使用.我unsigned int用于数量,包括循环索引.我使用uint8_t,uint16_t并且uint32_t当用于数据存储的大小事宜.的short数据类型是不明确的用于数据存储,因为它是一个最小值.随着stdint头文件的出现,不再需要short.