为了账号安全,请及时绑定邮箱和手机立即绑定

无符号int与大小t

无符号int与大小t

C++ C
慕沐林林 2019-07-02 15:09:11
无符号int与大小t我注意到现代C和C+代码似乎使用size_t而不是int/unsigned int几乎无处不在-从C字符串函数的参数到STL。我很好奇这样做的原因及其带来的好处。
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

这个size_t类型是无符号整数类型,它是sizeof运算符(以及offsetof运算符),因此保证它足够大,足以包含您的系统能够处理的最大对象的大小(例如,一个8GB的静态数组)。

这个size_t类型可以大于、等于或小于unsigned int,而您的编译器可能会对其进行优化假设。

您可以在C99标准第7.17节中找到更精确的信息,其草稿可在PDF格式,或C11标准第7.19节,也可作为PDF草稿.


查看完整回答
反对 回复 2019-07-02
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

总之,size_t永远不会是负的,而且它最大限度地提高了性能,因为它是一个无符号整数类型,它足够大-但不太大-可以表示目标平台上最大对象的大小。

尺寸永远不应该是负面的,事实上size_t是无符号类型。还有,因为size_t是无符号的,您可以存储大约是相应有符号类型的两倍的数字,因为我们可以使用符号位来表示大小,就像无符号整数中的所有其他位一样。当我们再得到一位时,我们将可以表示的数字范围乘以约2的倍数。

所以,你会问,为什么不直接用一个unsigned int?它可能无法容纳足够大的数字。在实现中unsigned int是32位,它能表示的最大数字是4294967295..某些处理器,例如IP16L32,可以复制大于4294967295字节。

所以,你会问,为什么不使用一个unsigned long int?它要求在某些平台上进行性能测试。标准C要求long至少占32位。IP16L32平台实现了每一个32位长的16位字.这些平台上的几乎所有32位操作符都需要两条指令,如果不是更多的话,因为它们使用两块16位块的32位。例如,移动32位长通常需要两个机器指令-一个移动每个16位块。

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


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 552 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信