跟我学C++中级篇——64位的处理

一、计算机的发展

计算机从二进制为基础开始描述整个世界,但正如现实世界一样,十进制为主的世界也会有万千百概念。所以在实际的应用中,会出现32位和64位的计算机系统。当然,前面还有过16位、8位和4位等,以后还可以会出现128位和256位甚至更高也不是没可能。怎么理解它们呢?先举一个不太形象的比喻。现实世界中的GDP的单位一般是万亿元为单位;大公司的利润一般是以亿元为单位,中小公司的利润一般是以万元为单位;而个人的收入一般是以元为单位。明白了吧。
在看韩国的电视剧时,经常有介绍对象的情况,中间人会说,男方非常优秀,年收入亿元。可以简单理解为这就是货币发展了,所以收入“提高”了。
同理,计算机也是如此,以前直接使用二进制处理数据就可以轻松的应对大多数的工作。但随着计算机技术的发展和应用的不断提高,对使用计算机来描述应用的要求也不断提高,为了能更好的适应这个改变,一种方法就是增加系统能表达的能力,也即从单纯的处理两位增加到64位。什么意思呢?就是处理数据的宽度从2位增加到64位,处理的数据大了,处理的速度也就快了。也可以理解为处理数据从一个基础单元到小的逻辑块(4、8),中型的逻辑块(16、32)再到大的逻辑块64位。

二、32位到64位

这里只从现在普遍使用的32和64位谈起,更早的因为几乎已经不可能再遇到了,故而不再赘述。
通过上面的初步分析,可能大多数人有了一个基础的印象,但可能仍然还是有些不清晰。再举一个例子,假如开发一个项目,需求中有一个要求是显示几千万亿的数据,如果是32位的系统,开发者可能需要做一些特殊的处理,才能显示(int32范围:2147483648~2147483647,类似long long这种是底层处理的)。 但是在64位的系统中就可以直接使用int64来表示,使用起来方便了很多。 但从32位到64位不是很多人想象的一个简单的数据宽度的变化。它是一个系统的工程,从CPU到寄存器,从内存,到总线等等的硬件都需要升级或匹配。单单是CPU指令集都是一个复杂的工程。

三、问题的提出

从32位到64位,最麻烦的不是实现,而是相关资料的不完善性。大家都知道,从32位系统到64位系统的发展不是一夜之间完成的,它经历一个相当长的时期,以至于到现在,仍然有大量的32位电脑在互联网上运行(可以看一下XP系统的数量)。反倒是后来的手机系统,基本都是64位的系统了,这就是后发者的优势。但这也带来了大量的问题,最重要的之一就是相关的64位的资料不完整、不完善甚至很多都已经陈旧。同样,在此基础上大量的相关工具也没有随着系统的进步而进步。下面就对这两个主要的问题分析说明一下:
1、陈旧的资料
资料的陈旧在网上和资料中非常常见,一个最主要的例子就是在编程的书籍中仍然使用循环来处理大数组,看下面的代码:

constexpr int64_t len = 1000*1000*1000;
Array[len] = {0};
for (int64_t id = 0;id < len;id++){Array[id] = id +100;
}

现在假设的长度为10个亿,一般来说在32位的系统上足够了。可如果到了64位的平台呢?在现在互联网上大的数组应用比比皆是。如果说上面的代码有些暴力,那么有一些代码可能就更容易出现问题:

for (int i = 0; i != width; ++i){for (int j = 0; j != height; ++j){for (int k = 0; k != depth; ++k){Array[k * width * height + j * width + i] = v;}}}

可能大多数开发者看到这段代码觉得没有什么,但是其实它并没有考虑大数组的情况(和上面的情况一致)。即如果数组的长度超过32位系统的长度会如何呢?所以解决这类的问题的方法应该是使用size_t,让系统自动去处理这些长度,而不是使用传统的int。同样,64位系统的演进是从硬件和底层开始的,那么直接面对它们的编程语言是汇编和C居多,抛除汇编,现在大多的64位资料多是以C为原型说明的,但现在应用上一直是用C++在不断的替代C,而针对C++相关的64位资料则相对较少。而随着系统和库的升级,一些数据类型的定义产生了冲突,这就导致在一些具体的场合下出现了问题。比如在Windows的开发库中,DWORD_PTR和DWORD已经成为了同一类型,但这种变化,可能会导致老的代码的无法正常运行。
2、落后的工具
比如在一些64位的数据库系统中,将指针存储到了int32类型的数据中,这样的结果是什么?很难想象。支持不同平台的静态代码分析器,可能会因为具体的编译及标准不同导致分析结果的不同。最典型的例子就是在VC上可以编译的代码在Linux GCC无法编译。同样,64位平台的发展,也使得早期的很多工具都已经不再完美,需要不断的进行迭代升级,但实际上,这种想法是相当虚妄的。除了某些大公司支持的工具和特别流行的工具外,相当多的工具仍然处于这种不完美的状态。

之所以大多数人对此不敏感,主要的原因在于“应用为主”,而且是上层的应用。这就导致大多数人甚至大多数开发者,对64的敏感性并不够。举一个简单的例子,大多的开发者,其实对内存的要求并不高,几百兆基本都能解决大多数的开发任务,而对于Java等更高级的语言,由于内存管理已经脱离开开发者的掌控,最易于与64位系统直接打交道的方式已经没有了。
放眼全世界,真正与系统底层进行交互,甚至以之为工作的开发者,少之又少。而这其中又包含了很多与此无关的工作,所以,对于应用方,其实很难直接面对32位系统和64位系统的不同导致的问题。

四、改善和提高

做为应用者,谈改善或提高64位系统的细节,有一些困难,不过也不是没有办法:
1、尽可能的找到最新的相关文档,比如硬件系统的官网
2、尽可能的了解使用工具的兼容性和一些问题,并针对这些问题有目的去避开相关的应用
3、针对平台系统的兼容性测试设计一些更详细更安全的单元测试等
4、针对开发者,要有目的的明白开发场景与系统位数的相关性和具体的内容并据此展开分析和编码

五、总结

对大多数开发者来说,这种警惕性可以有,但并不迫切。如果真得有机会搞到底层或硬件相关,再深入的学习和分析才是正解。但仍然在开发中要保持对不同位数系统的敏感,这才能避开系统引入的各种雷区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文献阅读 250125-Accurate predictions on small data with a tabular foundation model

Accurate predictions on small data with a tabular foundation model Accurate predictions on small data with a tabular foundation model | Nature 使用一种基于表格的模型来对小型数据实现准确预测 ## Abstract: 基于其他列来填充标签列中缺失值的基本预测任务对于各种应…

dup2 + fgets + printf 实现文件拷贝

思路 将源文件的内容读取到内存中&#xff0c;然后将这些内容写入到目标文件。 1: 打开源文件、目标文件 fopen() 以读模式打开源文件。 open ()以写模式打开目标文件。 2: 读取源文件、写入目标文件 fgets ()从源文件中读取内容。 printf ()将内容写入目标文件。 printf…

C++——list的了解和使用

目录 引言 forward_list与list 标准库中的list 一、list的常用接口 1.list的迭代器 2.list的初始化 3.list的容量操作 4.list的访问操作 5.list的修改操作 6.list的其他操作 二、list与vector的对比 结束语 引言 本篇博客要介绍的是STL中的list。 求点赞收藏评论…

Charles 4.6.7 浏览器网络调试指南:HTTPS抓包(三)

概述 在现代互联网应用中&#xff0c;网络请求和响应是服务交互的核心。对于开发者和测试人员来说&#xff0c;能够准确捕获并分析这些请求&#xff0c;是保证系统稳定性和性能的关键。Charles作为一个强大的网络调试工具&#xff0c;不仅可以捕获普通的HTTP请求&#xff0c;还…

js手撕 | 使用css画一个三角形 使用js修改元素样式 驼峰格式与“-”格式相互转化

1.使用css画一个三角形 借助 border 实现&#xff0c;在 width 和 height 都为 0 时&#xff0c;设置 border&#xff0c;便会呈现三角形。想要哪个方向的三角形&#xff0c;设置其他三边为 透明即可。同时&#xff0c;可以通过调整不同边的宽度&#xff0c;来调整三角形的高度…

六、深入了解DI

依赖注入是⼀个过程&#xff0c;是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源&#xff0c;⽽资源指的就是对象. 在上⾯程序案例中&#xff0c;我们使⽤了 Autowired 这个注解&#xff0c;完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…

Doris Schema Change 常见问题分析

1. 什么是 Schema Change Schema Change 是在数据库中修改表结构的一种操作&#xff0c;例如添加列、删除列、更改列类型等。 ⚠️Schema Change 限制⚠️ 一张表在同一时间只能有一个 Schema Change 作业在运行。分区列和分桶列不能修改。如果聚合表中有 REPLACE 方式聚合的…

Qt Designer and Python: Build Your GUI

1.install pyside6 2.pyside6-designer.exe 发送到桌面快捷方式 在Python安装的所在 Scripts 文件夹下找到此文件。如C:\Program Files\Python312\Scripts 3. 打开pyside6-designer 设计UI 4.保存为simple.ui 文件&#xff0c;再转成py文件 用代码执行 pyside6-uic.exe simpl…

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理 安装php8安装ImageMagick1、下载ImageMagick2、解压并安装3、查看是否安装成功 安装imagick扩展包 安装php8 点我安装php8 安装ImageMagick 1、下载ImageMagick wget https://www.imagemagick.org/download/ImageMa…

数据中台解决方案

数据中台概述 数据中台是数字化转型的基础&#xff0c;它不仅仅是一个平台&#xff0c;而是一套可持续让企业数据用起来的机制。这套机制涵盖了数据的采集、治理、开发到数据服务的全过程&#xff0c;旨在通过数据复用能力的提升&#xff0c;灵活支撑前端业务。数据中台通过“…

Linux——rzsz工具

rzsz这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过拖拽的方式将文件上传过去. 安装rzsz工具 rz&#xff1a;从Windows机器上传到远程Linux机器&#xff08;或者直接把文件托进Xshell中&#xff09; sz&#xff1a;将文件从Linux远…

SpringBoot基础概念介绍-数据源与数据库连接池

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池&#xff0c;同时介绍SpringBoot整合两种连接池的教程 文章目录 1 数据库与数据库管理系统2 JDBC与数…

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 &#xff08;1&#xff09;数据库与数据表说明。 &#xff08;2&#xff09;字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) &#xff08;1&…

js小游戏---2048(附源代码)

一、游戏页面展示 开始游戏&#xff1a; 游戏结束&#xff1a; 二、游戏如何操作 通过监听键盘的操作&#xff0c;进行移动变化 键盘上下左右键控制页面中所有模块同时向键入的方向移动&#xff0c;如果有两块一样的方块&#xff0c;就进行合并&#xff0c;并且在键盘每操作…

美格智能AIMO智能体+DeepSeek-R1模型,AI应用的iPhone时刻来了

导语&#xff1a; 当AI大模型从云端下沉至终端设备&#xff0c;一场关于效率、隐私与智能化的革命悄然展开。作为全球领先的无线通信模组及解决方案提供商&#xff0c;美格智能凭借其高算力AI模组矩阵与端侧大模型部署经验&#xff0c;结合最新发布的AIMO智能体产品&#xff0…

C语言的灵魂——指针(1)

指针是C语言的灵魂&#xff0c;有了指针C语言才能完成一些复杂的程序&#xff1b;没了指针就相当于C语言最精髓的部分被去掉了&#xff0c;可见指针是多么重要。废话不多讲我们直接开始。 指针 一&#xff0c;内存和地址二&#xff0c;编址三&#xff0c;指针变量和地址1&#…

物业巡更系统助推社区管理智能化与服务模式创新的研究与应用

内容概要 在现代社区管理中&#xff0c;物业巡更系统扮演着至关重要的角色。首先&#xff0c;我们先来了解一下这个系统的概念与发展背景。物业巡更系统&#xff0c;顾名思义&#xff0c;是一个用来提升物业管理效率与服务质量的智能化工具。随着科技的发展&#xff0c;传统的…

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN &#xff0c;以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

用Python和PyQt5打造一个股票涨幅统计工具

在当今的金融市场中&#xff0c;股票数据的实时获取和分析是投资者和金融从业者的核心需求之一。无论是个人投资者还是专业机构&#xff0c;都需要一个高效的工具来帮助他们快速获取股票数据并进行分析。本文将带你一步步用Python和PyQt5打造一个股票涨幅统计工具&#xff0c;不…

Centos类型服务器等保测评整/etc/pam.d/system-auth

修改服务器配置文件/etc/pam.d/system-auth&#xff0c;但是&#xff0c;把一下配置放在password的配置第一行才会生效 执行命令&#xff1a;配置口令要求&#xff1a;大小写字母、数字、特殊字符组合、至少8位&#xff0c;包括强制设置root口令&#xff01; sed -i 14a pas…