【问题标题】:Is using type unsigned char acceptable when only a small number is needed?当只需要一个小数字时,是否可以使用 unsigned char 类型?
【发布时间】:2017-02-09 17:21:00
【问题描述】:

如果编写程序,我需要一个小于 255 的数字,是否可以使用类型 unsigned char 用作数字,例如如果我需要一个数字来进行循环?是否有任何理由,包括坚持传统和惯例,坚持用int和float声明数字等。

例如,应该永远不要使用这样的代码吗?还是在这种情况下使用 unsigned char 是一种好习惯,因为它分配的内存比短 int 少?

#include <stdio.h>

typedef unsigned char short_loop;

int main(int argc, char *argv[])
{
  short_loop i;

  for(i = 0; i < 138; i++)
      printf("StackOverflow Example Code\n");

  return 0;
}

我要求将来参考,仅使用上面的代码来帮助说明。

【问题讨论】:

  • 只有当它是一个大数组的小数字时,它才是真正的好习惯。使用一个 char 而不是一个 int 对总内存的影响几乎为零
  • char 是整数类型,为什么存储数字没有用?有关内置类型之间性能差异的讨论,请参阅 this。使用 8 位 int 实际上可能比使用更大的 int 慢
  • 如果你和一个团队一起工作,他们会非常不喜欢你这样做。首先,因为不必要的 typedef 混淆了您对循环变量使用不寻常类型的事实。其次,因为它会造成维护噩梦。如果数组大小增加到 500 个条目,您的同事都不会期望他们需要更改循环变量的类型。
  • 感谢大家的反馈。听起来我最好坚持 int。
  • 您在谈论 char,但您的示例显示的是 unsigned char。这令人困惑。

标签: c variables memory-management integer


【解决方案1】:

是的,使用unsigned char 很好。不过我不会使用short_loop typedef,它只是无缘无故地混淆了代码。

有些人会推荐使用uint8_t 来强调intent 是一个小整数,而不是字符数据;即使uint8_t 很可能是unsigned char 的类型定义。

理论上你可以使用 typedef uint_fast8_t,它的意思应该是“无符号整数类型,至少 8 位,并且是可用类型中最快的”,显然“最快”的解释有点模糊.

【讨论】:

  • 你推荐使用 uint8_t 吗?
  • @Malina 我个人会使用int,但这更多的是个人喜好问题,而不是任何令人信服的技术原因。
  • 使用除 int 以外的任何东西都不是很传统。并且uint8_t 不保证存在。这种过早的优化(就内存而言)会降低可读性,并且如果要增加超过 255 的字面量,则需要进行修改。在很多程序中,它的定义是避免幻数,并且在某些情况下允许自定义,就好像我们想要打印我们的自己乘以字符串。它必须在循环中显式转换文字可能两次(因此在 BP 系列中进行了优化),这是为了提高性能。但意义不大。就像节省 3 个字节一样。
  • @Malina uint_fast8_t 解决了这些问题。 int 不能解决任何这些问题,它只是将故障点从 255 转移到 32767。我对一些可用堆栈少于 2K 的系统进行了编程,在这些情况下,节省 3 字节是值得的
  • 你是对的,但是uint_fast8_t 的使用会禁止 NAI。不是很实用和通用的方法。如果主要目的是使用尽可能低的内存,那么是的。 (另外我相信你的意思是short 不是int
【解决方案2】:

我不会这样做的。

如果您的程序正在处理大型值数组,那么使用char 数组而不是int 数组在内存使用方面有好处。

但是,对于单个循环的控制变量,由于多种原因,不太可能带来太多好处,并且可能会影响性能。

比较i &lt; 138 将在进行比较之前将i 提升为int,因为138 的类型为int。初始化和递增i 也可能发生提升(和向下转换)。

int 通常是主机上的“本机类型”——这通常意味着它是主机上首选的类型(例如,硬件提供在该类型上运行时针对性能进行了优化的寄存器)。其中,即使在循环中进行比较之前使用了某种技术来防止将unsigned char 提升为int,对int 的操作也可能更有效。

因此,最终,您的方法可能会或可能不会带来性能优势。唯一可以确定的方法是对代码进行剖析......并且好处(或其他方面)将取决于编译器(例如受优化方法的影响)和主机相关(例如与 unsigned char 相比,操作的效率如何)对int的操作)

您的方法也使代码更难理解,因此更难正确。而且,如果其他程序员(或您)将来修改代码,任何好处都可能被否定....例如,意外地重新引入了意外的类型转换。

【讨论】:

    【解决方案3】:

    用于 PC - 不是很好的做法。 用于嵌入式设备 - 取决于。

    如果保证不超过255,那么肯定可以用,反正转成int还是可以的,不过这个例子中内存差别不是很大。

    它违反了可读性。


    正如其他人所说,您正在不必要地混淆您的代码。 使用类型定义..也给它起丑陋的名字。 已知索引的类型为 int。仅此而已。

    【讨论】:

      猜你喜欢
      • 2019-07-24
      • 1970-01-01
      • 2013-06-14
      • 2023-03-21
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多