范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

sizet这个类型的意义是什么?

  类型名称不直观,从size_t这个名字很难理解它的用处,使用时候还要特别留意是unsigned类型,而且在数数的时候可以用int或者unsigned 代替。这种类型的优势在哪里?
  1.  学过计算机组成原理应该不会对此有疑问。int小于等于数据线宽度,size_t大于等于地址线宽度。size_t存在的最大原因可能是因为:地址线宽度历史中经常都是大于数据线宽度的。在数据只有8位的年代,地址率先进入10位,12位,在数据16位的年代,地址也已经进入了20位,24位。目前的int普遍是32位,而size_t在主流平台中都是64位。size_t为什么存在?因为无论int还是unsigned都很可能小于size_t需要的大小,所以必须有个size_t。
  补充:据说题主对_t有疑惑。这个问题很简单,仅仅是因为作者选择这样的命名作为编码规范而已。类型名与变量名共享相同的命名空间,所以通常需要在命名方面刻意区分出来。在遥远的 C 时代,发明者很可能是想建议所有的类型名后面加_t,只不过这并没有成为更普遍的编码规范罢了。而现今Java的规范倒比较容易让人接受:大写开头的是类型名,小写开头的是变量名跟函数名,虽然具体细则有不同,但原意都是一样的:变量与类型共享同一个命名空间,因而需要在命名规则上刻意区分开来。
  2.  之前在《内存拷贝的注意事项》一文中提到过size_t,可能许多人对这个类型不太熟悉没有用过或者根本不敢去用,最近看到一篇文章对这个类型讲的比较详细,便翻译过来让不熟悉的同学可以知道它产生的原因以及如何使用。
  前言:使用size_t可能会提高代码的可移植性、有效性或者可读性,或许同时提高这三者。  在标准C库中的许多函数使用的参数或者返回值都是表示的用字节表示的对象大小,比如说malloc(n) 函数的参数n指明了需要申请的空间大小,还有memcpy(s1, s2,n)的最后一个参数,表明需要复制的内存大小,strlen(s)函数的返回值表明了以’’结尾的字符串的长度(不包括’’),其返回值并不是该字符串的实际长度,因为要去掉’’。或许你会认为这些参数或者返回值应该被申明为int类型(或者long或者unsigned),但是事实上并不是。C标准中将他们定义为size_t。标准中记载malloc的申明应该出现在,
  定义为:void *malloc(size_t n);  memcpy和strlen的申明应该出现在中:void *memcpy(void *s1, void const *s2, size_t n);
  size_t strlen(char const *s)  size_t还经常出现在C++标准库中,此外,C++库中经常会使用一个相似的类型size_type,用的可能比size_t还要多。
  据我所知,大部分的C和C++程序员害怕这些库使用size_t,因为他们不知道size_t代表什么或者为什么这些库需要使用它,归根结底,原因在于他们什么时候什么地方需要用到它。
  可移植性问题早期的C语言(由Brian Kernighan 和 Dennis Ritchie 在The C Programming Language书中所写,Prentice-Hall, 1978)并没有提供size_t类型,C标准委员会为了解决移植性问题将size_t引入,举例如下:让我们来写一个可移植的标准memcpy函数,我们将会看到一些不同的申明和它们在不同平台不同大小的地址空间上编译下的情况。回忆memcpy(s1,s2,n)函数,它将s2指向地址开始的n个字节拷贝到s2指向的地址,返回s1,这个函数可以拷贝任何数据类型,所以参数和返回值的类型应该为可以指向任何类型的void*,同时,源地址不应该被改变,所以第二个参数s2类型应该为const void*,这些都不是问题。真正的问题在于我们如何申明第三个参数,它代表了源对象的大小,我相信大部分程序员都会选择int:void *memcpy(void *s1, void const *s2, int n);  使用int类型在大部分情况下都是可以的,但是并不是所有情况下都可以。int是有符号的,它可以表示负数,但是,大小不可能是复数。所以我们可以使用unsigned int代替它让第三个参数表示的范围更大。在大部分机器上,unsigned int的最大值要比int的最大值大两倍,比如说再也给16位的机器上,unsigned int的最大值为65535,int的最大值为32767。尽管int类型的大小依赖于C编译器的实现,但是在给定的平台上int对象的大小和unsigned int对象的大小是一样的。
  因此,使用unsigned int修饰第三个参数的代价与int是相同的:void *memcpy(void *s1, void const *s2, unsigned int n);  这样似乎没有问题了,unsigned int可以表示最大类型的对象大小了,这种情况只有在整形和指针类型具有相同大小的情况下,比如说在IP16中,整形和指针都占2个字节(16位),而在IP32上面,整形和指针都占4个字节(32位)。(参见下面C数据模型表示法)
  C数据模型表示法最近,我偶然发现几篇文章,他们使用简明的标记来表述不同目标平台下c语言数据的实现。我还没有找到这个标记的来源,正式的语法,甚至连名字都没有,但他似乎很简单,即使没有正规的定义也可以很容易使用起来。这些标记的一边形式形如:I nI L nL LL nLL P nP。 其中每个大写字母(或成对出现)代表一个C的数据类型,每一个对应的n是这个类型包含的位数。I代表int,L代表long,LL代表long long,以及P代表指针(指向数据,而不是函数)。每个字母和数字都是可选的。 例如,I16P32架构支持16位int和32位指针类型,没有指明是否支持long或者long long。如果两个连续的类型具有相同的大小,通常省略第一个数字。例如,你可以将I16L32P32写为I16LP32,这是一个支持16位int,32位long,和32位指针的架构。 标记通常把字母分类在一起,所以可以按照其对应的数字升序排列。例如,IL32LL64P32表示支持32位int,32位long,64位long long和32位指针的架构;然而,通常写作ILP32LL64。 不幸的是,这种memcpy的申明在I16LP32架构上(整形是16-bit 长整形和指针类型时32-bits)显得不够用了,比如说摩托罗拉第一代处理器68000,在这种情况下,处理器可能拷贝的数据大于65535个字节,但是这个函数第三个参数n不能处理这么大的数据。
  什么?你说很容易就可以改正?只需要把memcpy的第三个参数的类型修改一下:void *memcpy(void *s1, void const *s2, unsigned long n);  你可以在I16LP32目标架构上使用这个函数了,它可以处理更大的数据。而且在IP16和IP32平台上效果也还行,说明它确实给出了memcpy的一种移植性较好的申明。但是,在IP16平台上相比于使用unsigned int,你使用unsigned long可能会使你的代码运行效率大打折扣(代码量变大而且运行变慢)。在标准C中规定,长整形(无论无符号或者有符号)至少占用32位,因此在IP16平台上支持标准C的话,那么它一定是IP16L32平台。这些平台通常使用一对16位的字来实现32位的长整形。在这种情况下,移动一个长整形需要两条机器指令,每条移动一个16位的块。事实上,这个平台上的大部分的32位操作都需要至上两条指令。因此,以可移植性为名将memcpy的第三个参数申明为unsigned long而降低某些平台的性能是我们所不希望看到的。使用size_t可以有效避免这种情况。size_t类型是一个类型定义,通常将一些无符号的整形定义为size_t,比如说unsigned int或者unsigned long,甚至unsigned long long。每一个标准C实现应该选择足够大的无符号整形来代表该平台上最大可能出现的对象大小。使用size_tsize_t的定义在, , , , 这些标准C头文件中,也出现在相应的C++头文件, 等等中,你应该在你的头文件中至少包含一个这样的头文件在使用size_t之前。 包含以上任何C头文件(由C或C++编译的程序)表明将size_t作为全局关键字。包含以上任何C++头文件(当你只能在C++中做某种操作时)表明将size_t作为std命名空间的成员。根据定义,size_t是sizeof关键字(注:sizeof是关键字,并非运算符)运算结果的类型。所以,应当通过适当的方式声明n来完成赋值:n = sizeof(thing);考虑到可移植性和程序效率,n应该被申明为size_t类型。类似的,下面的foo函数的参数也应当被申明为sizeof:foo(sizeof(thing));参数中带有size_t的函数通常会含有局部变量用来对数组的大小或者索引进行计算,在这种情况下,size_t是个不错的选择。适当地使用size_t还会使你的代码变得如同自带文档。当你看到一个对象声明为size_t类型,你马上就知道它代表字节大小或数组索引,而不是错误代码或者是一个普通的算术值。
  3.  ize_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大小的连续数组依然是个不大可能的事情,但是..........
  "640K内存对于任何人来说都足够了"----比尔盖茨

江西28岁女子被未婚夫杀害,女子母亲曾让他到家里和女儿同居就在前几天,媒体报道了一名不到16岁的女孩被24岁男朋友杀死的消息,而且这个男朋友连同女孩的爷爷奶奶也一起杀死。最令人唏嘘的是,这个女孩被杀死的时候,还怀着这个男朋友的孩子!而这件尝了沂蒙土榨花生仁油做的菜,老婆直夸我手艺好,接下来懵逼了现在,随着生活水平的不断提高,很多人越来越注重吃的营养,吃的健康,吃的美味了仅仅营养和健康还远远不够,还必须要很好吃,这样才算得上是完美。大家都知道,花生油是日常生活中不可或缺的,RedmiK40是否值得购买?网友问得有点多余昨日卢伟冰发布了RedmiK40系列,RedmiBookPro以及Redmi新款大电视。RedmiBookPro是笔者期待挺久的笔记本,发布会上,卢伟冰说这款笔记本经过一年打磨,彻马云减持阿里股票,套现高达430亿,为什么最近富豪纷纷套现?最近一段时间,不断传出一些富豪股市套现的消息,且不说那些普通的富豪了,就是大名鼎鼎的超级富豪也在不断套现,引发了不少网友的关注。比如说,前一阵子传出马化腾套现的消息,套现金额高达7姚策走了,但是两个家庭的矛盾并没有结束,引发网友大讨论就在前几天,也就是2021年3月23日,错换人生28年的当事人姚策去世,到了第二天,也就是3月24日,姚策的遗体火化了。姚策虽然走了,但是两个家庭的矛盾并没有结束,而且还引发了网友为救狗命,浙江女子让30岁的老公下井丢掉了性命!留下了两个孩子随着生活水平的不断提高,现在不少人开始养各种宠物了,而有些人因为对宠物感情太深,结果有些走火入魔了,比如说有些人拿着自己的宠物狗比自己的爹娘还亲,称狗狗是自己的孩子,是家庭的成员,vivoS10Pro综合体验除了自拍拍照,它还有什么?自诞生以来,vivoS系列就定位于时尚娱乐中高端系列,以时尚主流和轻薄设计为特色,针对注重自拍体验的年轻群体,主打美颜和自拍。其中,vivoS9自发布以来,因为其独特的柔光双摄和轻工地挖出明代文物不停工?文物局文物保护条例我们从没执行过见过牛的,没有见过这么牛的!就在昨天也就是6月8日,媒体报道了这么一个消息前一段时间,江苏省泰州市海陵区一处建筑工地挖出了一块明代文物,惊动了当地的考古专家,专家看了之后判断该工地英国目前已出现最坏结果李嘉诚的几千亿巨额投资怎么办?最近一段时间,全球新冠状肺炎疫情大爆发,很多国家的经济都遭受到了不同程度的打击,而在欧洲,英国遭受的冲击尤其严重,据外国媒体报道,各种迹象显示,英国有可能陷入到300年来最严重的经中兴发布NodeEngine2。0白皮书,助力5G专网升级,赋能千行百业近几年,随着生产资料人力成本的上浮,不少企业的经营压力越来越大。再加之受到互联网的冲击,实体经济的发展势头一度疲软。千行百业想要在ToB领域中发展,却又不得章法,留给他们的是对未来2021TestFlight最全应用分享最近两个月一直被TF事件困惑相信大家也如此经过我仔细研究和深入探秘原来testflight的原来兑换码和邀请链接是两种方式安装,兑换码是直接在testflight平台直接兑换,而邀
竞争白热化Intel与Apple争夺台积电最新制程产能英特尔这两年面临前所未有的挑战,一方面是桌面和高性能计算市场被NVIDIA和AMD虎口夺食,另一方面自己的传统强项笔电市场面临巨大挑战,AMD已经拿下了可观的份额,而10多年的大客白话天下金毛siri事件,不就死了一条狗,值得全民开骂吗?大家好,我是大白,欢迎来到我的白话天下。昨天晚上b站头条都有白话粉丝让我聊聊这个金毛siri。这个事情,这两天闹得动静还真是挺大。既然要聊,我还是先跟很多不知道这事件的人,快速过一如果吴亦凡真是个加拿大烂人,都美竹的居心叵测就是为民除害文大白大家好,我是大白,欢迎来到我的白话天下。今天说一下吴亦凡事件。最近在微博上,一直零零星星都会看到一个女生的名字叫都美竹,我知道她在爆吴亦凡的料。一开始也没去细究,直到昨天,我本月内上市五菱NanoEV官图发布11月4日开启预订11月1日,五菱官方正式发布了旗下的NanoEV车型官图,新车将于11月4日开启预订,并于本月内上市。从官图来看,新车基本上延续了此前亮相的特别版车型的设计风格,但取消了疯狂动物城10。96万起2022款AIONY上市配置升级日前,广汽埃安官方宣布,旗下的2022款AIONY正式上市,新车推出7种配置版本可选,官方指导价区间为10。96万元15。76万元,将于2022年1月开始交付。作为年度改款车型,新2021年入驻亚马逊晚吗?亚马逊前景怎么样?跨境电商这个行业也出现了很多年了,身边不少的朋友也都入驻了一些跨境电商平台。现在,主流的国外跨境电商平台有亚马逊ebay虾皮和Lazada等。亚马逊平台是发展速度客户群范围数量平台G29赛车计划3游戏体验赛车计划在玩家群中经常被调侃为拍照计划,可见游戏的拟真程度有多高。赛车计划系列的开发商名为SlightlyMadStudios,以下简称SMS。而赛车计划之所以被玩家们所称道为拍照G29极限竞速地平线4乐高DLC游戏体验这次带来的游戏体验是极限竞速地平线4的乐高DLC,这是一款风格独特的乐高游戏,但游戏体验与本体游戏相差不大。PlaygroundGames工作室为了满足玩家群体的诉求,相继推出了财罗技G29尘埃4体验对很多热爱赛车游戏的朋友来说,拥有一款游戏方向盘是必不可少的,真实模拟的力反馈和震动感就像自己真的置身车椅之上,仿佛只有握住了方向盘才感觉自己是真的在赛道上驰骋,这时候键盘和手柄就跨境电商ERP采集上传货代系统的好处独立站系统支持OEM贴牌定制,服务器独立部署,源码定制为多家国内外电商企业提供企业整套解决方案一个端口也可以无限授权绑定店铺(无关联性质),打破一个端口绑定一套店铺资料的模式一个端亚马逊仓储物流ERP货代系统功能介绍跨境ERP货代系统功能介绍采集刊登主流平台一键批量刊登,一键采集支持拼多多1688淘宝天猫ShopeeLazada店铺免费绑定单个注册账号支持跨境本店铺绑定图片翻译支持商品的图片一