我在这里阅读Benefit of using short instead of int in for... loop,在循环计数器中使用short而不是plain int并没有多大意义,因为在大多数体系结构中short将占用与int相同的内存空间。这让我觉得短暂的内部实际上并没有用,因为它们不会产生人们的期望,即节省内存。但是,在生产代码中,我经常看到短整数被用作函数参数。例如,当我使用ack-grep浏览coreboot(coreboot.org)时,我发现很多功能都很简短。我意识到coreboot代码是相当低级的,但我想知道在x86架构上使用short而不是int的好处是什么?我什么时候应该使用它?
答案 0 :(得分:2)
使用short
的最大好处来自于它们在聚合中使用 - 主要在short
IOW的数组中,或者可能作为结构的成员 - 作为{{1}的数组通常占用short
数组的一半空间,条目数相同。
另一个可能的好处是,如果函数定义为采用int
,则您知道该值将在-32768 .. + 32767范围内(在具有2的补码整数和16位的系统上) short
,这是大多数系统),可以简化函数内部的验证过程。如果传递的类型是short
而不是int
,但有效值的范围是-32788 .. + 32767,那么您必须验证传递的值是否在范围内(假设{{1} },这是不保证但是很典型的。)
否则,除非您匹配某种外部规范,否则short
类型的变量不会提供太多帮助。
答案 1 :(得分:1)
某些功能适用于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
的功能的性能在名义上被认为比int
略差,因为在short
和处理器的首选{之间}可能需要不同数量的代码来推广/降级{1}}。根据定义,int
* 1是处理器名义上优选的整数大小。
当然,任何性能问题都需要进行性能分析才能验证,但要点是int
用于以可能的性价比来节省空间。
* 1仍在寻找规范def,所以现在这是我的意见。