当前位置:  开发笔记 > 编程语言 > 正文

unsigned int vs. size_t

如何解决《unsignedintvs.size_t》经验,为你挑选了5个好方法。

我注意到现代的C和C++代码似乎size_t代替int/ unsigned int几乎无处不在 - 从C字符串函数的参数到STL.我很好奇这个原因及其带来的好处.



1> Remo.D..:

size_t类型是无符号整数类型是结果sizeof操作(和offsetof运营商),因此它是保证足够大,以包含您的系统可以处理的最大对象(例如,8GB的静态数组)的大小.

size_t类型可能比比大,等于,或小于unsigned int,你的编译器可能会做出假设它进行优化.

您可以在C99标准中找到更准确的信息,第7.17节,其草案可在因特网上以pdf格式或在C11标准第7.19节中获得,也可作为pdf草案获得.


不.想想使用大型(非巨大)内存模型的x86-16:指针远(32位),但单个对象限制为64k(因此size_t可以是16位).
"最大对象的大小"措辞并不差,但绝对正确.对象的六个可以比地址空间更受限制.
我只是希望这种越来越流行的类型不需要包含头文件.
@Marc:我认为关键在于编译器可以用这些知识做*事情.
"你的编译器可能会假设它":我希望编译器_knows_确定`size_t`可以表示的值的确切范围!如果没有,谁呢?

2> 小智..:

经典C(由Brian Kernighan和Dennis Ritchie在C编程语言中描述的C的早期方言,Prentice-Hall,1978)没有提供size_t.C标准委员会介绍size_t了消除可移植性问题

在embedded.com上详细解释(有一个很好的例子)


另一篇解释size_t和ptrdiff_t的精彩文章:http://www.viva64.com/en/a/0050/

3> Rose Perrone..:

简而言之,size_t永远不会消极,并且它最大化性能,因为它的typedef将是无符号整数类型,足够大 - 但不是太大 - 来表示目标平台上最大可能对象的大小.

大小永远不应该是负数,实际上size_t是无符号类型.另外,因为size_t是无符号的,所以可以存储大约是相应签名类型的两倍大的数字,因为我们可以使用符号位来表示幅度,就像无符号整数中的所有其他位一样.当我们再获得一位时,我们将我们可以表示的数字范围乘以大约两倍.

所以,你问,为什么不使用unsigned int?它可能无法容纳足够多的数字.在unsigned int32位的实现中,它可以表示的最大数字是4294967295.某些处理器(如IP16L32)可以复制大于4294967295字节的对象.

所以,你问,为什么不使用unsigned long int?它确实在一些平台上造成了性能损失.标准C要求long占用至少32位.IP16L32平台将每个32位长实现为一对16位字.这些平台上的几乎所有32位运算符都需要两条指令(如果不是更多),因为它们与两个16位块中的32位一起使用.例如,移动32位长通常需要两个机器指令 - 一个用于移动每个16位块.

使用size_t避免了这种性能损失.根据这篇精彩的文章,"Type size_t是一个typedef,它是某些无符号整数类型的别名,通常unsigned int或者unsigned long甚至可能是偶数unsigned long long.每个标准C实现都应该选择足够大的无符号整数 - 但不超过需要的大小 -表示目标平台上最大可能对象的大小."


@Mitch:在一个无符号整数中可以表示的最大值可以并且确实在一个系统与另一个系统之间变化。它必须至少是“ 65536”,但通常是“ 4294967295”,在某些系统上可能是“ 18446744073709551615”(2 ** 64-1)。

4> Kevin S...:

size_t类型是sizeof运算符返回的类型.它是一个无符号整数,能够表示主机上支持的任何内存范围的字节大小.它(通常)与ptrdiff_t有关,因为ptrdiff_t是有符号整数值,使得sizeof(ptrdiff_t)和sizeof(size_t)相等.

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

另一方面,int类型基本上定义为主机可用于最有效地执行整数运算的(带符号)整数值的大小.例如,在许多旧的PC类型计算机上,值sizeof(size_t)将是4(字节)但sizeof(int)将是2(字节).尽管CPU可以处理高达4 GiB的(逻辑)存储空间,但16位算术比32位算术快.

只有在关心效率时才使用int类型,因为它的实际精度很大程度上取决于编译器选项和机器架构.特别是C标准指定了以下不变量:sizeof(char)<= sizeof(short)<= sizeof(int)<= sizeof(long)对程序员可用于每个的精度的实际表示没有其他限制这些原始类型.

注意:这与Java中的不同(实际上为每个类型'char','byte','short','int'和'long'指定了位精度).


"它是一个无符号整数,能够表示主机支持的任何内存范围的字节大小." - >否.`size_t`能够表示任何单个对象的大小(例如:数字,数组,结构).整个内存范围可能超过`size_t`

5> Maciej Hehl..:

类型size_t必须足够大,以存储任何可能对象的大小.Unsigned int不必满足该条件.

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


"object"是标准使用的语言.
我认为`size_t`仅在编译器可以接受X类型时才需要这么大,这样sizeof(X)会产生大于4G的值。大多数编译器都会拒绝例如`typedef unsigned char foo [1000000000000LL] [1000000000000LL]`,甚至如果foo [65536] [65536];超出了文档中定义的实现定义的限制,则可能会被拒绝。
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有