【问题标题】:Benefits of defining a function accepting short int instead of int定义接受 short int 而不是 int 的函数的好处
【发布时间】:2013-10-06 21:08:16
【问题描述】:

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

【问题讨论】:

  • 使用short 的最大好处在于它们被聚合使用——在short IOW 的数组中——因为该数组占用了@987654324 数组的一半空间@。另一个可能的好处是,如果函数被定义为采用short,您知道该值将在 -32768..+32767 范围内(在具有 2 的补码整数和 16 位 short 的系统上,是大多数系统),这可以简化您在函数内部的验证过程。否则,short 类型的变量不会有太大帮助,除非您匹配某种外部规范。
  • @JonathanLeffler 为什么不回答这个问题?
  • 通过“验证过程” - 你的意思是检查溢出吗?做空如何让这更容易?

标签: c function int short


【解决方案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 和处理器首选int 之间可能需要不同数量的代码来提升/降级。 int 根据定义 *1 是处理器名义上首选的整数大小。

当然,任何性能问题都需要分析来验证,但要点是 short 用于以潜在的名义性能成本节省空间。

*1 仍在寻找规范定义,所以现在这是我的意见。

【讨论】:

    【解决方案2】:

    使用short 的最大好处在于它们被聚合使用——主要是在short IOW 的数组中,或者可能作为结构的成员......因为short 的数组通常占用相同数量的条目的int 数组的一半空间。

    另一个可能的好处是,如果函数被定义为采用short,您知道该值将在 -32768..+32767 范围内(在具有 2 的补码整数和 16 位 @987654326 的系统上) @,这是大多数系统),这可以简化函数内部的验证过程。如果传递的类型是int 而不是short,但有效值的范围是-32788..+32767,那么您必须验证传递的值是否在范围内(假设sizeof(int) > sizeof(short),不能保证但很典型)。

    否则,short 类型的变量没有多大帮助,除非您匹配某种外部规范。

    【讨论】:

    • +1 因为没有说 sizeof(int) 总是 > sizeof(short)。今天的嵌入式系统是一个显着的用途,它们通常是相同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多