定义接受short int而不是int的函数的好处

时间:2013-09-30 21:02:46

标签: c function int short

我在这里阅读Benefit of using short instead of int in for... loop,在循环计数器中使用short而不是plain int并没有多大意义,因为在大多数体系结构中short将占用与int相同的内存空间。这让我觉得短暂的内部实际上并没有用,因为它们不会产生人们的期望,即节省内存。但是,在生产代码中,我经常看到短整数被用作函数参数。例如,当我使用ack-grep浏览coreboot(coreboot.org)时,我发现很多功能都很简短。我意识到coreboot代码是相当低级的,但我想知道在x86架构上使用short而不是int的好处是什么?我什么时候应该使用它?

2 个答案:

答案 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,所以现在这是我的意见。