我注意到现代的 C 和 c + + 代码似乎使用size_t ,而不是int/ 于 STL 功能几乎无处不在的 C 字符串参数中的unsigned int我很好奇,这和它所带来的好处的原因。

2008-09-25 07:00:03
问题评论:

回答:

size_t类型是无符号的整数类型的sizeof运算符 (和offsetof运算符) 的结果、 足以包含的最大大小以便它可以保证大对象系统可以处理 (如 8 Gb 的静态数组)。

size_t类型可能大于等于或小于一个unsigned int,并且编译器可能臆测它进行优化。

您可能会发现在 C99 标准,部分 7.17,该草案是可通过 internet 访问或 C11 标准,部分 7.19,也可用作pdf 草稿pdf格式更精确的信息.

不对。X86-16 大 (不大) 的内存模型的思考︰ 指针是到目前为止 (32 位),但单个对象限于 64k (因此 size_t 可以是 16 位)。

"最大对象大小"不是很差的措辞,但绝对正确。对象的 sixe 可以是更多比的地址空间的限制。

"您的编译器可能会使它假设": 我希望编译器知道size_t可以表示的值的确切范围 !如果不是,谁在做?

@Marc︰ 我认为,多个编译器可以用这些知识了点。

经典 C (C 由 Brian Kernighan 和金士 Ritchie 在 C 编程语言,描述早期方言 Prentice 大厅,1978年) 没有提供 size_t。C 标准委员会引入 size_t 消除可移植性问题

在 embedded.com (有一个很好的示例) 的详细说明

另一个很好的文章解释 size_t 和 ptrdiff_t: viva64.com/en/a/0050

Size_t 类型是由 sizeof 运算符返回的类型。它是可以表达的任何主机上支持的内存范围的字节大小的无符号的整数。它 (通常) 与 ptrdiff_t,ptrdiff_t,sizeof(ptrdiff_t) 和 sizeof(size_t) 相等是一个带符号的整数值。

编写 C 代码时,应始终使用 size_t 每当处理内存范围。

主机可以使用最有效地执行整数运算 (有符号) 的整数值的大小作为另一方面基本上定义 int 类型。例如,很多旧型电脑类型计算机值 sizeof(size_t) 4 (字节) 但 sizeof(int) 将是 2 (字节)。16 位算术比 32 位运算,是尽管 CPU 可以处理的最多 4 钩 (逻辑) 的内存空间。

仅当您关心效率及其实际精度取决于强编译器选项和计算机体系结构时,请使用 int 类型。特别是 C 标准指定以下固定条件︰ sizeof(char) < = sizeof(short) < = sizeof(int) < = sizeof(long) 的实际表示形式供程序员每种基元类型的精度上放置任何其他限制。

注意︰ 这不是 Java (它实际上为每个类型 char、 字节、 短、 int 和长时间指定位精度) 一样。

事实上 int 的定义是它是 16 位 16 机上,并在任何较大的 32 位。已写入该假设 int 是 32 位宽,若要更改此现在,因此人们应始终使用 size_t 太多代码或 {,u} int {8,16,32,64} _t 特定 — 作为预防措施,人们是否应该只是总是使用这些数据,而不是不可或缺的整数类型。

"它是无符号的整数,可以表达的大小以字节的任意内存区域,支持主机计算机。"--> 否size_t是否能够代表任意单个对象的大小 (如︰ 数字、 数组、 结构)。整个内存范围可能超出size_t

简而言之,size_t 永远不会为负,且它最大化性能,因为它的 typedef 是否能足够 — 大的无符号的整数类型,但不是太大,表示在目标平台上最大的可能对象的大小。

绝不应负,大小和 size_t 确实是无符号的类型。此外,因为 size_t 未签名,可以存储是大约两倍一样大,与相应的有符号类型,因为我们可以使用符号位表示量值,像所有的其他位的无符号整数中的数字。当我们得到了一位时,我们将大大增加我们可以代表的大约两倍的数字范围。

那么,您问,为什么不只是使用一个unsigned int呢?它不能保存足够的数字大。在实现中unsigned int为 32 位的位置,它可以表示的最大数量为4294967295某些处理器,如 IP16L32,可以复制大于 4294967295 字节的对象。

那么,您问,为什么不使用一个unsigned long int呢?它 exacts 性能收费在某些平台上。标准 C 要求,long占据至少 32 位。IP16L32 平台实现每个 32 位的一对 16 位字长。在这些平台上的几乎所有 32-位运算符都需要两个说明,如果不多,因为它们使用两个 16 位数据块中的 32 位。例如,将 32 位长时间移动通常要求两个计算机说明--一个移动每个 16 位块。

使用 size_t 可以避免此性能收费。根据本文别具一格,"size_t 类型的 typedef 是部分的无符号的整数类型,通常无符号的整数或无符号长整型,但更可能是无符号的长长的别名。每个标准 C 实现是假定选择足够 — 大的无符号的整数,但不是需要-来表示在目标平台上最大的可能对象的大小大。

对不起,我对此发表评论,这样长时间,但我只是不得不确认无符号的整数可以容纳的最大数量或许我 misunderstanding 术语,但并无符号的整数可以容纳的最大数量为 4294967295,但我认为 65356 是最大的无符号短值。

如果您无符号的整型占据 32 位,然后是,它可以容纳的最大数量为 2 ^32-1,即 4294967295 (0xffffffff)。您有其他问题吗?

没有其他问题,我不只是好奇,您为什么使用 65,356,这将意味着 16 位无符号的整数,我已经永远不会知道无论如何最常见的情况。

@Mitch︰ 可在一个unsigned int表示的最大值可以和 does 会有所不同从一个系统到另一个。需要为至少65536,但它通常是4294967295 ,可能是18446744073709551615 (2 * * 64-1) 在某些系统上。

哦好了。是否存在一种标准或规定的内容则是至少 65536 吗?此外,我刚才 realised 我写而不是 65536-65356 whoops !

Size_t 类型必须是对象的不够大,无法存储所有可能的大小。无符号的整数并不一定满足该条件。

例如在 64 位系统中的 int 和无符号的整数可能是宽,32 位但 size_t 必须足够大,存储数字大于 4 G

"对象"是标准使用的语言。

我认为size_t只需要的规模很大,如果编译器无法接受 X 的类型,这样,sizeof(X) 会产生大于 4 G 的值。大多数编译器就会如拒绝typedef unsigned char foo[1000000000000LL][1000000000000LL],甚至foo[65536][65536];可合法地拒绝如果它超过了有案可稽的实现定义的限制。

@MattJoiner︰ 用词很好。"反对"不是存储的含糊不清,而定义是存储的指"区"。

内容来源于Stack Overflow unsigned int vs. size_t
请输入您的翻译

unsigned int vs. size_t

确认取消