我知道标题看起来有点傻,但请耐心听我说一下。
自从我开始使用 size_t
和 ptrdiff_t
以来,就再也没有用过 int
了,至少我能记得的有这么久。
我最近记得使用的唯一整数数据类型属于以下某一类别之一:
(无符号) 整数与内存中某些数据结构(例如
vector
)中的索引相关联。
几乎总是,此类情况下最适合使用的类型为size_t
(或者如果你想多做一些努力,则是...::size_type
)。
即使该整数实际上并不代表索引,通常它仍然与某个索引相关联,因此size_t
仍然适用。size_t
的有符号版本。在许多情况下,对于此类问题,似乎最适合的类型是ptrdiff_t
,因为通常情况下,当您需要此类型时,您正在使用迭代器--因此对它们来说,size_t
和ptrdiff_t
都是适用的。long
。我偶尔需要这个用于_InterlockedIncrement
(参考计数)。(
unsigned
)long long
,用于保存文件大小。unsigned int
或unsigned long
,用于 "计数" 目的(例如,每 100 万次迭代,更新 UI)。unsigned char
,用于对内存进行原始字节级访问。
(附注:我从未发现使用过signed char
的场景。)intptr_t
和uintptr_t
,偶尔用于存储操作系统句柄、指针等。
重要的是,int
的一个特定方面是您不应该溢出它(因为这是未定义行为),因此您甚至不能可靠地将其用于计数--尤其是如果您的编译器将其定义为 16 位。
那么,何时应该使用 int
呢(除了当你的依赖项已经要求使用它时)?
在新编写的可移植代码中,现在是否还有任何真正的用途?
operator++(int)
? :) - Yuushisize_t
和ptrdiff_t
没有被typedef为(unsigned) int
。long
除外(64位Windows除外)。 - Daniel Fischersize_t/ptrdiff_t
在大多数实现中都被 typedef 为(unsigned) int
。在大多数64位平台上它们并不是,即使在我的32位平台上,它们在我使用的所有编译器中都被 typedef 为(unsigned) long
。 - Daniel Fischer