编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

《鹏哥C语言第一课》第116.2讲 位段的跨平台问题讨论 #c语言

gowuye 2024-04-25 04:42 4 浏览 0 评论

同学们,这个视频再给大家讲一个东西叫位段的跨平台性的问题,就是位段。前面已经提到了,它很好,会节省内存空间。有的人说:老师,我是不是就使用位段就行了?其实位段的使用还是要谨慎一些,因为位段其实存在一些跨平台性的问题。

就给大家简单的说一下这几个跨平台性的问题,希望大家在使用的时候,以后用的时候能够做一些取舍,做一些分析。同学们看一下位段的跨平台性的问题。

·第一点就是位段被当成有符号还是无符号来处理,这是不确定的。在这地方大家注意,假设写出了这样一个位段式的结构,我这写的虽然是int杠a,int杠b,int杠c,int杠d,但是当在这地方假设开辟的一个整型空间,这个整型空间我会把它当成有符号数来处理,还是无符号数来处理,不一样,不确定。

如果把它当成有符号数来处理的时候,大家注意,那意味着什么?因为这32个假设一个整型32个比特位,这32个比特位的最高位,这个比特位如果当时有法整型就是符号位了,如果无法整型,这一位放的就是有效位,有效的数字位,所以这个是不确定的,这个标准的并没有给出明确的规定。

·第二点就是位段中的最大的位数是不确定的,16位机器最大的位可能是16,30位机器最大的位可能是16,最大的32。如果写成27,写了这样一段代码在16位的机器上其实就跑不过去。这个地方大家注意,可能大家可能不太了解,在这个地方数字的后面是不是这个地方要写?这个杠d要占几个比特位?

在早期16位机器上int类型,也就是整型类型,整型类型是占两个字节的,也就是16个比特位的。而在现在的机器上,现在常见的32位或者是64位机器上int类型是什么?int类型是四个字节,也就是32个比特位的。

这个时候大家注意,当我写的这个代码,d想30个比特位,这写着30,就这一段代码在当前的32位处理环境底下肯定是没问题的,因为这儿写30是合理的。但同样这一段代码如果放在16位机器下编译的时候就出问题了,因为d最大就是两个字节,16个比特位,这个地方咔给我写个30是不是出问题了?

所以同样这样一段代码放在不同的平台,放在其他的编辑器上,可能就或16位的机器的编译器上可能会存在问题。这是它的第二个不确定性。

第三个位段中的成员在内存中是从左向右分配,而从右向左分配,这个是标准尚未定义的。什么意思?这我刚刚其实没仔细给大家去讲,给大家简单的说一下,没给大家仔细去讲,稍微给大家做一个说明。

我想表达的意思是什么意思?是这个意思。

注意,把内存空间再拷贝一份,放这,假设改成struet,这个地方改成a,创建一个sa。同志们,这个地方有一个问题摆在面前是非常实际的问题,当在这创建a变量的时候,在内存的时候一定要为它分配一个空间。

这个地方是怎么分配空间的?大家注意,它的成员是int,都是int,这个时候给不同的成员分配空间的时候怎么分配?就是一次性首先给大家分配一个整型。大家注意,内存分配的方式可以这么理解,一次性先分配一个整型的大小,也就是32个比特位。

这其实已经画出来了,这是一个字节,这又是一个字节,这又是一个字节,这是又这个字节,四个字节,大家注意,这个咔给大家分写一下,四个字节,这个时候大家注意,一次性给你分配四个字节。当这地方要进存的时候,因为它的成员都是int,所以一次给你分配四个字节。

当一次性把这四个字一个整型都分配好之后,问题来了,杠a要占两个比特位,杠a到底是占这边的两个比特位,还是这边两个比特位是从右向左使用,还是从左向右使用?内存空间到底该怎么使用?这是不确定的,c语言标准并没有规定到底是先要从右边向左使用,还是从左边向右使用。

理论上讲,这两种方式都是可以的。大家想象一下,如果杠a占两个比特位,杠a是不是就把这两个比特位占了?如果杠b说它占5个比特位,紧接着往后使用,5个比特位就是12345,是不是杠c说它要占10个比特位,那就再给大家数10个比特位。

杠c是10个,12345,456789,10,然后杠d说他有30个比特位,这个地方是不是不够了?前面这个地方大家注意,我杠a放进去,这个地方我给大家写上,这个地方是我的杠a,这样我给大家刚刚放的是杠b,杠b这边放的时候杠c是不是?

注意我到底是从哪边使用编译器是不去你的,我当前画的时候是从右向左使用的这四个字节里边,从右向左使用,但是也有可能存在的是从左向右使用,这个完全取决于编译器,所以它是不跨平台的是标准的,尚未定义。

这是我刚刚说的,当然这个讲解的过程中就其实又引入了第四个跨平台级的问题。第四个是什么?第四个就是我刚刚说这个地方来看一下,当一个结构包含两个位段成员的时候,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这个也是不确定的。

啥意思?你看刚刚我们这地方分析到了,说我们这个四个字节,我已经把杠a杠b杠c都放进去了,现在来说杠d,杠d这个地方说他说他有30个比特位,那我们刚刚这地方放完这前面之后,17个比特位,总共四个字节32个比特位是不是还剩15个比特位,这还是剩55比特位,结果杠d说我需要30个字节,30个比特位那不够了,不够的情况下,同学们,我肯定还要分配空间的对不对?

好了,我假设给你续上了,我又给你分配了一个整型的空间。那问题来了,当我给你分配这个整型空间之后,注意那这15个比特位,我到底是用还是不用,我是把它浪费掉,还是这用15个后面再用15个,这个也是不确定的。

就是当把前面的这些位段成员,放好了之后剩余的位段不够放下一个成员的时候,剩余的这些位到底是舍弃还是利用?这个是不确定的。

种种这样的一些不确定性的导致位段的是存在一些跨平台性问题的。跨平台性问题的,同学们,大家能够听懂意思吗?当然这个是跟结构体相比的,结构体是有领取规则的对不对?它是它的成员对齐的规则,怎么来分配内存空间的?这个是确定的。

跟结构相比的位段可以达到同样的这种效果,并且可以节省空间,但是它存在一些跨平台性的问题。同学们,大家听懂了吗?所以未来大家如果坚持说这个场景里面就想使用位段,让它能够足够的节省空间,这个时候就要面临它跨平台性的问题。

怎么去解决这种跨平台性的问题?这个时候就要把不同的平台的情况研究清楚,针对这个平台的写一部分的,写这个平台的代码,写另外一个平台的新的代码。后期在编译的时候可以选择这个叫条件编译,满足这个条件的编编这部分的代码,针对不同的平台的编译不同代码就可以了。

跨平台性问题虽然存在,但它并不是说就没法使用位段了,对位段一样是可以使用的,只不过要更加小心谨慎的使用。这个点大家听懂了吗?

如果大家对于位段存在的问题也了解的时候,这个视频暂时讲这里,下个视频想给大家再介绍一下位段的应用。下个视频再见。

相关推荐

Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优
Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优

Nginx缓存优化是帮助大家提升网站性能的重要操作之一,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存;fastcgi_cache主要用于...

2024-05-20 14:44 gowuye

王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动
王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动

王者荣耀官方终于确定了天魔缭乱和逐梦之音的返场活动,这让不少小伙伴乐开了花,返场活动将会在3月22日开启,下面就带来王者荣耀天魔缭乱和逐梦之音返场活动地址!王者...

2024-05-20 14:44 gowuye

常见的嵌入式web服务器有哪些?

嵌入式WEB服务器常见的有:Lighttpd,Shttpd,Thttpd,Boa,Mini_httpd,Appweb,Goahead。Lighttpd地址:http://www.light...

简述几款常见的嵌入式web服务器
简述几款常见的嵌入式web服务器

嵌入式web服务器,是web服务器当中的一种,是基于嵌入式系统而实现的web服务器。指的是在嵌入式系统(通俗点就是单片机系统)上实现的一个web服务器,可以通过...

2024-05-20 14:44 gowuye

教你如何利用fastcgi_cache缓存加速WordPress

在使用nginx缓存之前,必须在nginx里面加载专门的模块,这个模块叫做ngx_cache_purge。添加ngx_cache_purge模块下载ngx_cache_purge模块ngx_cache...

扫描WordPress漏洞

检测已知漏洞WPScan是一款广泛使用的WordPress安全扫描工具,它的一项重要功能是检测已知漏洞。在这篇文章中,我们将深入探讨WPScan如何检测已知漏洞,并结合实际示例,帮助读者更好地理解和应...

消灭 Bug!推荐几个给力的开源 Bug 跟踪工具
消灭 Bug!推荐几个给力的开源 Bug 跟踪工具

在这个充满bug的世界里,最遥远的距离不是生与死,而是你亲手制造的bug就在你眼前,你却怎么都找不到它。因此本文准备了7款优秀的开源bug跟踪系...

2024-05-20 14:43 gowuye

生物信息分析入门全攻略

生物信息学是生命科学研究的重大前沿领域,未来将占据生命科学研究的半壁江山。已经有越来越多的小伙伴投入到生物信息的学习中,但是入门难、深入慢、摸不到方向等都成为持续学习的拦路虎。本文根据生物信息技术大牛...

elkb实践经验,再赠送一套复杂的配置文件
elkb实践经验,再赠送一套复杂的配置文件

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。宝剑锋从磨砺出,梅花香自苦寒来。诗人白居易,三月下江南,看到沿路开放的桃花,心潮澎湃...

2024-05-20 14:43 gowuye

超详细从0到1 搭建ELK监控
超详细从0到1 搭建ELK监控

监控分类?Metrics用于记录可聚合的数据。例如,1、队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP请求个数可被定义为一个计数器,...

2024-05-20 14:42 gowuye

嵌入式开发 之Web配置页面开发
嵌入式开发 之Web配置页面开发

1.PHP是最好的语言??开发动态页面首选的语言是PHP,村村不能在这里忽悠人,如果你的硬件性能允许切略懂PHP,看到这里就可以退出了。本文面向的受众是Linu...

2024-05-20 14:42 gowuye

Python开发一个网站目录扫描工具用来检测网站是否有漏洞?
Python开发一个网站目录扫描工具用来检测网站是否有漏洞?

开发一个网站目录扫描工具是用来检测网站是否有非法目录请求的一个常见需求之一,我们要通过这个扫描工具来找到通过某个域名可以访问到的网站路径,可能对于有些系统来讲,...

2024-05-20 14:42 gowuye

创建一个类似Youtube的Id——使用PHP/Python/JS/Java/SQL

id通常都是用数字,不巧的是只有10个数字来使用,所以如果你有很多的记录,id往往变得非常冗长。当然对于计算机来说无所谓,但我们更希望id尽可能短。所以我们如何能使id变短?我们可以利用字母让它们附加...

快速云:有助于移动应用安全开发的五条妙计
快速云:有助于移动应用安全开发的五条妙计

许多企业不断地向其开发团队提供培训。但是某些漏洞,如早在十多年前就发现的SQL注入,如今仍广泛存在于各种应用中。因而,安全培训永不过时。在开发移动应用时,开发者...

2024-05-20 14:41 gowuye

洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映
洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映

7月2日,由M&CSaatchi创作,由深受好评的澳大利亚导演迈克尔·格雷西执导的动画短片《G’day》,正式在全网上映。该影片因其出色的创意赢得了洛...

2024-05-20 14:41 gowuye

取消回复欢迎 发表评论: