size_t本身一个作用就是避免考虑64还是32。64位下Long和指针是64位的
size_tm_unNo;
sprintf(path,"%u",m_unNo); //这句在32位机器上正常 64位机器上会编译警告:“警告:格式 ‘%u’ 需要类型 ‘unsigned int’,但实参 4 的类型为 ‘size_t’”
%u 对应 unsigned int在64位机器上还是32位,而size_t已经变成64位了。
int和long作为基本的整数类型,取值范围和位数直接相关。如果是n位整数的话,最高位表示符号位,剩下的n-1位以补码形式表示绝对值,因此范围是整数区间[-2^(n-1),2^(n-1))。
int和long并没有明确位数,具体和平台相关(有一点可以确定,sizeof(int)<=sizeof(long))。
关于size_t
问题1:为啥不用int而是size_t这么古怪的类型,搞出好多类型不匹配的警告?
答:一个共识是:int类型一般小于等于数据线的宽度,而size_t类型一般为大于等于地址线宽度。而地址线宽度常常是大于数据线宽度的。
在数据只有8位的年代,地址率先进入10位,12位,在数据16位的年代,地址也已经进入了20位,24位。目前的int普遍是32位,而地址线宽度在主流平台中都是64位。
size_t为什么存在?因为无论int还是unsigned都很可能小于地址线宽度需要的大小,所以必须有个size_t。
问题2:为什么size_t后面要什么有个_t?
答:_t的意思就是type。关于为什么要加_t。一个类型后面加了_t说明了这是一个POSIX或GNU保留类型,防止命名空间污染(namespace pollution)。
不然标准库里新加了什么类型说不定就和用户已经定义的类型重名了。所以POSIX规定自己扩展的类型都加_t,这样只要用户定义类型的时候不加_t就不会冲突。
————————————————
size_t和unsigned int有所不同,size_t的取值range是目标平台下最大可能的数组尺寸
,一些平台下size_t的范围小于int的正数范围,又或者大于unsigned int.
最典型的,在x64下,int还是4,但size_t是8.这意味着你在x64下最大可能开辟的数组尺寸是2^64.
如果你使用int或者unsigned int,那么在x64下如果你的代码中全部使用uint作为数组的尺寸标记,
那么你就会失去控制2^32尺寸以上的数组的机会.虽然现在在x64上开辟一个大于2^32大小的连续数组依然是个不大可能的事情,但是..........
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。