首页 > 其他分享 >关于size_t

关于size_t

时间:2024-05-27 11:33:29浏览次数:23  
标签:架构 int unsigned long 关于 size 指针

size_t是什么?为什么要使用它?

首先,我们给出size_t的定义:
size_t的全称是size type,即“记录大小的数据类型”,是sizeof运算结果的类型,一个unsigned整型。

以防万一,sizeof(chr)返回的是变量或类型在内存中占用的字节数。

size_t 被用在哪里?

c库中的许多函数会使用size_t,请看如下函数的定义:

void *malloc(size_t n);
void *memcpy(void *si, void const *s2, size_t n);
size_t strlen(char const *s);

没错,strlen返回的并不是int,而是一个size_t。
但为什么不直接使用int,而是size_t?
因为size_t可以提高代码的可移植性与可读性,下面我们会解释原因。

为什么是size_t?

首先,数据的大小不可能是负数,为了能表示更大的范围,储存数据大小的类型应该是unsinged的。

为什么不能用unsigned int?

在不同的系统架构中,整型和指针占用的字节数是不同的。
有些时候整型和指针的字节和指针的字节数相同(比如IP16),指针传回的数据范围与int也是相同的,在这里使用unsinged int并不会产生问题。
但在另一些架构里(比如I16LP32),占32字节的指针有可能传回比int更长的数据,仅靠unsinged int就无法处理这么大的数据了。

I16、I16LP32描述的是不同平台下c语言数据的实现,用大写字母代表数据类型,数字代表该类型所占用的字节数。
例如I16LP32代表的是:支持16位int,32位long与指针。
I L LL P依次为int, long, long long, 指针

为什么不用unsigned long?

如果unsigned int不够大,那全部替换成unsigned long总够用了吧?
使用unsigned long确实能保证函数的参数处理32位指针传回的数据,但在IP16L32平台中,long通常是由一对16位的块来实现的,这使得移动long时需要执行两条机械指令(在这样的平台上,大部分对32位数据的操作都需要两条机器指令),在这种平台上,你的代码效率会大大降低。
不仅如此,即使unsigned long也可能不足以处理传入的数据,也许我们甚至还要改成unsigned long long...

使用size_t

此时,我们可以发现int和long的问题出现在移植上:要么不能正确地在不同架构中运行,要么在一些架构中效率降低,若要进行完美的移植,就要为不同架构替换不同的数据类型(这真是太恐怖了)。
size_t则不会产生这些问题,它代表了对应数据在架构中占用的字节数,也就是说,在IP16架构中,它可以处理16位的数据,在I16LP32架构中,不需要对代码作出更改,这个参数就能处理32位的数据。同时,只要看到size_t我们就能知道它代表的是一个字节大小或一个数组的索引,这也是为什么它能提高代码的可读性。

标签:架构,int,unsigned,long,关于,size,指针
From: https://www.cnblogs.com/cyberCitrus/p/18215167

相关文章

  • 关于泊松流生成模型(PFGM++)官方GitHub代码的一知半解
    论文:PFGM++:UnlockingthePotentialofPhysics-InspiredGenerativeModelsCodeisavailableathttps://github.com/Newbeeer/pfgmpp问题,学习官方代码后,生成数据会有以下报错解决方案:将generate.py中的调整为调整后即可正常运行,并生成图片相关参考Python*args和......
  • 关于全局变量的坑, golang熟手们经常遇到
    关于全局变量的坑,golang熟手们经常遇到原创 fengzi Go语言圈 2024-05-2708:30 广东 听全文Go语言圈Go语言开发者的学习好助手,分享Go语言知识,技术技巧,学习与交流Go语言开发经验,互动才有助于技术的提升,每天5分钟,助你GO语言技术快乐成长160篇原创内容公......
  • 关于Scrum中的"3355"
    3355是敏捷开发中Scrum框架的一个核心概念,它代表了Scrum框架的三个角色、三个工件、五个关键事件和五个价值观。三个角色:ProductOwner(产品负责人):负责定义需求,确定需求优先级,定义需求验收标准,定义产品发布内容与日期。ScrumMaster(敏捷教练):帮助团队遵循Scrum框架,持续改进......
  • 关于Module中在junit测试方法和非测试方法中获取相对路径不一致的问题
    注意:Module中在junit测试方法和非测试方法中获取相对路径不一致的问题如果在Module中测试相对路径是从当前Module下找非测试相对路径是在项目下找分析原因:Module中非测试方法属于整个项目方法,它面向整个Project,Project包含了下面的各个模块(module),所以非测试方法中,获取文......
  • 关于Vue弹框组件this.$confirm
    确定后不能刷新页面列表show_tank(record){varthat=thisthis.$confirm({title:'您确定要选择吗?',content:'选择后不可修改',closable:true,//是否显示右上角的xmaskClosable:true,//触发阴影层的点击......
  • 关于BSP
    在嵌入式系统中,BSP(BoardSupportPackage)通常被称为板级支持包或板级支持软件,它是一组针对特定硬件平台的软件支持包。BSP在嵌入式系统中扮演着连接硬件和操作系统的桥梁角色,为开发人员提供了一个统一的接口层,简化了硬件和软件之间的交互。以下是关于BSP的详细解释:1.**定义与功......
  • 关于spring中使用 Undertow 作为嵌入式服务器上传文件但是限制的代码不生效问题
    背景:在做毕业设计的时候发现了使用Undertow作为嵌入式服务器上传文件限制的代码不生效,只能上传1MB以内的图片,一旦上传超过1MB的图片就会报错。代码:spring:datasource:hikari:idle-timeout:600000#10minmax-lifetime:1800000#30minservlet......
  • 易语言关于微信收款监控软件写法的思考
    想写微信收款监控,正规途径是企业认证申请sdk。可是这个确实是有门槛的,好像每年都要交不少的钱,好像是,具体我也不记得了。如果能够监控收款,就可以利用微信写自动成交工具。很多卖虚拟的,就可以实现自动发卡。所以很多人就想走其他的捷径,看能不能绕过官方,自己监控。最简单的......
  • 关于智慧校园平台,你了解多少?
     智慧校园是指运用现代信息技术,如物联网(IoT)、大数据、云计算、人工智能(AI)等,对传统校园进行智能化改造和升级,旨在创建一个高度集成、信息共享、服务全面的校园生态系统。智慧校园不仅仅是技术的应用,更是一种教育理念和管理模式的革新,它强调物理空间和信息空间的深度融合,力图实......
  • 关于Undertow启动时的警告日志
    错误提示:当使用Undertow作为SpringBoot嵌入式服务器时,启动应用。会看到有一条 WARN 日志,如下:UT026010:BufferpoolwasnotsetonWebSocketDeploymentInfo,thedefaultpoolwillbeused大致意思是“没有给WebSocketDeploymentInfo设置Bufferpool,将会使用默......