我在这里读到了在 for... 循环中使用 short 而不是 int 的好处,在循环计数器中使用 short 而不是普通的 int 并没有真正意义,因为在大多数架构中,short 将占用与 int 相同数量的内存空间。这让我认为短整数真的没有用,因为它们不会导致人们可能期望的结果,即节省内存。但是,在生产代码中,我经常看到短整数用作函数参数。例如,当我使用 ack-grep 浏览 coreboot (coreboot.org) 时,我发现许多功能都很短。我意识到 coreboot 代码相当低级,但我想知道在 x86 架构的 C 中使用 short 而不是 int 有什么好处(如果有的话)?我应该什么时候使用它?
2 回答
使用的最大好处short
是当它们被聚合使用时——主要是在short
IOW 的数组中,或者可能作为结构的成员——因为一个数组short
通常占用int
具有相同数量条目的数组的一半空间。
另一个可能的好处是,如果函数被定义为采用 a short
,您知道该值将在 -32768..+32767 范围内(在具有 2 的补码整数和 16 位的short
系统上,这是大多数系统),这可以简化函数内部的验证过程。如果传递的类型int
不是,short
但有效值的范围是 -32788..+32767,那么您必须验证传递的值是否在范围内(假设sizeof(int) > sizeof(short)
,这不能保证,但很典型)。
short
否则,除非您匹配某种外部规范,否则类型变量并没有多大帮助。
一些功能适用于short
,而另一些功能适用于int
.
如果想计算一个中设置的所有位,请short
使用
int CountBits_short(short x);
如果想计算一个中设置的所有位,请int
使用
int CountBits_int(int x);
这里没有性能问题,只是功能差异。
@JonathanLeffler 对 OP 的评论总结了最有用的原因,因为short
它们可能占用更少的空间。
其他
其他想法:
在sizeof(int) == sizeof(short)
没有性能优势的平台上。
否则我们知道sizeof(int) > sizeof(short)
。
编译器可能会为以下代码制作类似的进入/退出代码,并且没有性能差异。
void foo_s(short bar);
void foo_i(int bar);
在传递指针时
void foo_s(short *bar);
void foo_i(int *bar);
是一样的sizeof(bar)
,因为它是一个地址,对于增加传递也没有任何好处。
在传递数组中
void foo_s(short bar[]);
void foo_i(int bar[]);
bar
成为第一个元素的地址,同样大小,因为它是一个地址,在扩充传递中也没有任何好处。
名义上认为使用的函数的性能比处理器的首选性能可能需要不同数量的代码来提升/降级short
稍差。 根据定义 *1 是处理器名义上首选的整数大小。int
short
int
int
当然,任何性能问题都需要分析来验证,但要点是short
用于以潜在的名义性能成本节省空间。
*1 仍在寻找规范定义,所以现在这是我的意见。