stdint.h为整数大小,类型和范围提供了许多选项 - 很多我不知道选择哪些选项!
我知道how to use size_t
and ptrdiff_t
在适当的时候,我使用固定大小的类型进行存储和传输。我的问题涉及只存储在主机内存中的值。
例如,图像的结构可能包含以下成员:
struct image {
integer width, height; /* pixel dimensions of the image */
integer bits_per_pixel;
...
};
如果width
和height
永远不会超过SHRT_MAX
,是应该使用short
还是坚持使用int
?图像不能具有负宽度或高度,因此使用无符号类型?也许(u)int_least16_t
是正确的选择?还有别的吗?
如果bits_per_pixel
永远不会超过64,请使用char
,unsigned char
,uint8_t
,int
或其他?
你会在这个例子中使用什么以及为什么?
代码运行的CPU架构如何影响选择?即PPC或x86,32或64bit 代码运行的设备如何影响选择?即桌面,电话,控制台 选择如何与性能和优化相关?
我的问题简单来说就是:你如何选择使用哪个整数?
答案 0 :(得分:4)
我会说:不要太担心这一点,它往往是一种过早优化的形式。但我的经验法则是:
int
。它应该是机器的自然字大小。unsigned
类型。(u)intX_t
类型。unsigned char
用于值为<= UCHAR_MAX
的大型数组。请注意<stdint.h>
中的很多类型都是可选的,因此您无法依赖它们的存在。 POSIX使这稍微好一些。
答案 1 :(得分:3)
对于您的示例,我只需对所有三个字段使用int
或(可能更好)unsigned
。除了包含数千或数百万个元素的数组之外,使用较小的类型是没有意义的;它只是强加了人为限制。
要回答更一般的问题,请遵循以下指南:
size_t
。stdint.h
中的一个固定大小的整数类型(uint8_t
,uint16_t
,uint32_t
等)。想到这种需求的常见例子是像素值,音频样本和Unicode字符(通常分别为8位,16位和32位)。int
或unsigned
可能是正确使用的类型。答案 2 :(得分:1)
没有严格的规则。
如果选择的类型太小,最终可能会人为地限制程序可以处理的数据集。太大了,你的表现可能会受到影响。
除非您针对特定任务遇到性能问题,否则我肯定会倾向于“太大”。虽然对比特/像素使用整数是有点傻,但在更大的方案中它可能不会伤害任何东西。
答案 3 :(得分:1)
除非你的应用程序真的是内存密集型,否则不要担心大小并使用int。使用short或char可能会导致细微的错误,这些错误可能会在以后引起问题。此外,使用char或short不会获得任何额外的CPU周期。