【发布时间】:2012-12-05 06:51:02
【问题描述】:
我确实意识到这个标题一开始可能听起来很傻,但是请耐心等待我一会儿。 :)
自从我开始使用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)时? :) -
请阅读:stackoverflow.com/questions/739727/… TL;DR:int 是内置类型,size_t 是define,int 可以表示负数,这对...数学有用吗?说真的。
-
@KSchmidt 无论编译成什么,它仍然是一个 unsigned 类型。
-
@Yuushi 我没有说相反的话。但是“size_t 的签名版本”根本没有任何意义。这个问题也没有任何意义——当然有符号值很有用!当您进行数学运算并且需要表示有符号值时,例如 x/y 位置等
-
@KSchmidt 我怀疑
size_t和ptrdiff_t在大多数实现中都被定义为(unsigned) int。long,是的(在 64 位 Windows 上除外)。