unsigned int vs. size_t
我注意到现代C和C ++代码似乎在任何地方使用size_t
而不是int
/ unsigned int
- 从C字符串函数的参数到STL。 我很好奇这个原因及其带来的好处。
#1楼
size_t
类型是无符号整数类型,它是sizeof
运算符(和offsetof
运算符)的结果,因此保证它足够大以包含系统可以处理的最大对象的大小(例如,静态数组8GB)。
size_t
类型可能大于,等于或小于unsigned int
,并且您的编译器可能会对其进行假设以进行优化。
您可以在C99标准中找到更准确的信息,第7.17节,其草案可在因特网上以pdf格式或在C11标准第7.19节中获得,也可作为pdf草案获得 。
#2楼
类型size_t必须足够大,以存储任何可能对象的大小。 Unsigned int不必满足该条件。
例如,在64位系统中int和unsigned int可能是32位宽,但size_t必须足够大以存储大于4G的数字
#3楼
经典C(由Brian Kernighan和Dennis Ritchie在C编程语言中描述的C的早期方言,Prentice-Hall,1978)没有提供size_t
。 C标准委员会引入size_t
来消除可移植性问题
在embedded.com上详细解释(有一个很好的例子)
#4楼
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'指定了位精度)。
#5楼
size_t是指针的大小。
因此,在32位或公共ILP32(整数,长,指针)模型中,size_t是32位。 并且在64位或公共LP64(长,指针)模型中,size_t是64位(整数仍然是32位)。
还有其他模型,但这些是g ++使用的模型(至少默认情况下)
#6楼
在研究该主题时,glibc手册0.02的摘录也可能是相关的:
在版本2.4之前,size_t类型和GCC版本存在潜在问题。 ANSI C要求size_t始终是无符号类型。 为了与现有系统的头文件兼容,GCC将stddef.h' to be whatever type the system's
size_t定义stddef.h' to be whatever type the system's
sys / types.h定义的stddef.h' to be whatever type the system's
。 大多数在`sys / types.h'中定义size_t的Unix系统将其定义为有符号类型。 库中的某些代码依赖于size_t是无符号类型,如果签名则无法正常工作。
期望size_t无符号的GNU C库代码是正确的。 size_t作为签名类型的定义不正确。 我们计划在版本2.4中,GCC将始终将size_t定义为无符号类型,并且fixincludes' script will massage the system's
sys / types.h'以免与此冲突。
与此同时,我们通过在编译GNU C库时明确告诉GCC使用unsigned类型的size_t来解决这个问题。 `configure'将自动检测GCC用于size_t的类型,以便在必要时覆盖它。
#7楼
如果我的编译器设置为32位,则size_t
只是unsigned int
的typedef。 如果我的编译器设置为64位,则size_t
只是unsigned long long
的typedef。
#8楼
简而言之, size_t
永远不会消极,并且它会最大化性能,因为它的typedef将是无符号整数类型,足够大 - 但不是太大 - 来表示目标平台上最大可能对象的大小。
大小永远不应该是负数,并且size_t
确实是无符号类型。 此外,由于size_t
是无符号的,因此您可以存储大约是相应签名类型的两倍的数字,因为我们可以使用符号位来表示幅度,就像无符号整数中的所有其他位一样。 当我们再获得一位时,我们将我们可以表示的数字范围乘以大约两倍。
所以,你问,为什么不使用unsigned int
? 它可能无法容纳足够多的数字。 在unsigned int
为32位的实现中,它可以表示的最大数字是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
。每个Standard C实现应该选择足够大的无符号整数 - - 但不比需要大 - 表示目标平台上最大可能对象的大小。“
unsigned int vs. size_t相关推荐
- size_t是什么数据类型?为什么要用size_t替代int、unsigned int、unsigned long、unsigned long long
今天看RXW源码的时候,发现有个代码把for循环的节点定义为size_t类型,我想这个循环才几次啊,你就用size_t,逼装的不错哦!,,那么size_t究竟是嘎哈用的呢?让我们来看看! 别看了,破案 ...
- unsigned int用法
注意使用unsigned int(无符号常数) 正如我们所知道的,编程语句都有很多的基本数据类型,如char,inf,float等等,而在C和C++中还有一个特殊的类型就是无符号数,它由unsigne ...
- 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
1.腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中? 思想:用数组来存这40亿个数,而且只能用bit来表示.why? ...
- 深入解剖unsigned int 和 int
就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char.int.Int ...
- 无法从“std::_Binder std::_Unforced,SOCKET ,LPSOCKADDR,unsigned int ”转换为“int”
无法从"std::_Binder<std::_Unforced,SOCKET &,LPSOCKADDR,unsigned int>"转换为"int&q ...
- C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- C 关于unsigned int compzero = ~0;与unsigned int compzero = 0xFFFF; 的区别!
C 关于unsigned int compzero = ~0;与unsigned int compzero = 0xFFFF; 的区别! unsigned int zero = 0; unsigned ...
- 嵌入式中的 *(volatile unsigned int *)0x500 解释
C语言中*(volatile unsigned int *)0x500的解释: 如下: (unsigned int *)0x500:将地址0x500强制转化为int型指针 *(unsigned int ...
- 【编程】char unsigned int float double long 字节数
定义方面: 1.int为整数型,用于定义整数类型的数据 . 2.float为单精度浮点型,能准确到小数点后六位 . 3.double为双精度浮点型,能准确到小数点都十二位 . 4.char为字符型,用 ...
最新文章
- Linux平台 Oracle 18c RAC安装Part2:GI配置
- 忙~~~~~~~~~~~~~~~~~
- 成年人的低头,从拼多多开始
- 输出1/n(是循环小数的,只输出第一个循环节)
- 缓存-SpringCache-自定义缓存配置
- c#求三角形面积周长公式_此题要求三角形的面积,但是无法用公式求出,而是通过方程解决...
- python中datetime库_一天掌握一个Python库--datetime库
- 结构数组-创建结构数组---获取修改结构数组数据-------操作字段
- Backend Qt5Agg is interactive backend. Turning interactive mode on.
- python.day.07——函数式编程
- ACT开发初步(二)——XML
- 苹果NFC功能以及Apple Pay的初探
- windows 清除IE浏览器缓存的脚本
- java工资多少 程序员薪资很高吗?
- AAAI-19录用论文
- [置顶] 程序员面试之道(《程序员面试笔试宝典》)之程序员如何保持身心健康?
- oracle 落落是谁,落落是老虎妖精吗?落落的父母是什么身份?
- Unity打包webgl文本框不显示汉字
- ping命令常用参数
- 关于使用LocationManager时遇到的问题