选择最适合的整数大小/范围作为变量使用

6

C99中的stdint.h提供了许多整数大小、类型和范围的选项 - 太多了,我不知道该选择哪个!

我知道如何在适当的时候使用size_tptrdiff_t,并且我使用固定大小的类型进行存储和传输。我的问题涉及仅将值存储在主机内存中的情况。

例如,一个用于图像的结构可能包含以下成员:

struct image {
    integer width, height; /* pixel dimensions of the image */
    integer bits_per_pixel;
    ...
};

如果widthheight永远不会超过SHRT_MAX,是应该使用short还是继续使用int?图像的宽度或高度不能为负数,因此使用无符号类型?也许(u)int_least16_t是正确的选择?还是其他什么?
如果bits_per_pixel永远不会超过64,应该使用charunsigned charuint8_tint或其他什么?
在这个例子中你会使用什么,为什么?
CPU架构如何影响代码运行时的选择?例如PPC或x86,32位或64位。
设备如何影响代码运行时的选择?例如桌面、手机、控制台。
选择与性能和优化有何关系?
简单地说,我的问题是:如何选择要使用的整数类型?
4个回答

4
我会说:不要太担心这个问题,这往往是一种过早优化的形式。但我的经验法则是:
  • 尽可能使用普通的int类型,它应该是机器的自然字长。
  • 当您需要定义明确的整数溢出时,请使用unsigned类型。
  • 当您需要使用二进制补码表示时,请使用(u)intX_t类型。
  • 对于值<= UCHAR_MAX的大型数组,请使用unsigned char
请注意,<stdint.h>中的许多类型都是可选的,因此您不能依赖其存在。 POSIX使这稍微好一些。

3
对于您的示例,我建议使用int或(可能更好的是)unsigned来表示所有三个字段。除了在包含数千或数百万个元素的数组中使用较小的类型外,没有必要使用较小的类型;这只会强加人为限制。
回答更一般的问题,以下是我遵循的一些准则:
  • 始终选择正确的符号来存储值。
  • 对于对象计数、索引、内存中字符串/数据的长度等,请使用size_t
  • 对于具有特定值范围并且您永远不需要在该范围之外存储值的数据,请使用stdint.h中的一个固定大小的整数类型(例如uint8_tuint16_tuint32_t等)。我想到的这种需求的常见示例是像素值、音频样本和Unicode字符(分别通常为8、16和32位)。
  • 否则,intunsigned可能是正确的类型。

1

没有硬性规定。

如果您选择的类型太小,可能会人为地限制程序可以处理的数据集。太大了,性能可能会受到影响。

除非您在特定任务中遇到性能问题,否则我肯定会倾向于“太大”。虽然为位/像素使用整数有点愚蠢,但在更大的范围内它可能不会对任何事情造成伤害。


1

除非您的应用程序确实是内存密集型的,否则不要担心大小并使用int。使用short或char可能会导致细微的错误,这些错误可能会在以后引起问题。此外,使用char或short也不会为您带来额外的CPU周期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接