当前位置: 首页 > news >正文

跟我学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、针对开发者,要有目的的明白开发场景与系统位数的相关性和具体的内容并据此展开分析和编码

五、总结

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

相关文章:

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

一、计算机的发展 计算机从二进制为基础开始描述整个世界&#xff0c;但正如现实世界一样&#xff0c;十进制为主的世界也会有万千百概念。所以在实际的应用中&#xff0c;会出现32位和64位的计算机系统。当然&#xff0c;前面还有过16位、8位和4位等&#xff0c;以后还可以会…...

指针的介绍2后

1.二级指针 1.1二级指针的介绍 二级指针是指向指针的指针 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 100;int* pa &a;int** ppa &pa;printf("a %d\n", a);printf("&a(pa) %p\n", pa);prin…...

Linux 学习笔记__Day3

十八、设置虚拟机的静态IP 1、VMware的三种网络模式 安装VMware Workstation Pro之后&#xff0c;会在Windows系统中虚拟出两个虚拟网卡&#xff0c;如下&#xff1a; VMware提供了三种网络模式&#xff0c;分别是&#xff1a;桥接模式&#xff08;Bridged&#xff09;、NAT…...

Ubuntu x64下交叉编译ffmpeg、sdl2到目标架构为aarch64架构的系统(生成ffmpeg、ffprobe、ffplay)

一、编译SDL2-2.0.9 &#xff08;1&#xff09;&#xff0c; ./configure --prefix/home/z/Desktop/sdl2 --enable-sharedyes --enable-nasmno --enable-audiono --enable-ossno --enable-alsano --enable-alsa-sharedno --enable-pulseaudiono --enable-pulseaudio-sharedno …...

【时时三省】(C语言基础)文件的随机读写

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 fseek 根据文件指针的位置和偏移量来定位文件指针 示例&#xff1a; 这个输出的就是ade seek&#xff3f;cur的意思是从当前偏移量 2就是从a往后偏移两个就是d 偏移量 SEEK&#xff3f;CUR…...

HPO3:提升模型性能的高效超参数优化工具

引言 在当今快速发展的数据科学和机器学习领域中&#xff0c;超参数优化&#xff08;Hyperparameter Optimization, HPO&#xff09;是构建高性能模型不可或缺的一环。为了简化这一复杂过程&#xff0c;恒通网络科技团队推出了HPO3模块——一个专为Python开发者设计的强大库&a…...

【Docker】Docker入门了解

文章目录 Docker 的核心概念Docker 常用命令示例&#xff1a;构建一个简单的 C 应用容器1. 创建 C 应用2. 创建 Dockerfile3. 构建镜像4. 运行容器 Docker 优势学习 Docker 的下一步 **一、Docker 是什么&#xff1f;****为什么 C 开发者需要 Docker&#xff1f;** **二、核心概…...

AIGC(生成式AI)试用 19 -- AI Agent

AI Agent&#xff1a;自主完成特定目标任务。 AI Agent&#xff1a;以大语言模型为大脑驱动的系统&#xff0c;具备自主理解、感知、规划、记忆和使用工具的能力&#xff0c;能够自动化执行完成复杂任务的系统。AI Agent不同于传统的人工智能&#xff0c;它具备通过独立思考、调…...

LeetCode:70. 爬楼梯

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的…...

《Trustzone/TEE/安全从入门到精通-标准版》

CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…...

2025神奇的数字—新年快乐

2025年&#xff0c;一个神奇的数字&#xff0c;承载着数学的奥秘与无限可能。它是45的平方&#xff08;45&#xff09;&#xff0c;上一个这样的年份是1936年&#xff08;44&#xff09;&#xff0c;下一个则是2116年&#xff08;46&#xff09;&#xff0c;一生仅此一次。2025…...

第一个3D程序!

运行效果 CPP #include <iostream> #include <fstream> #include <string> #include <cmath>#include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/…...

Hive:内部表和外部表,内外转换

内部表和外部表 内部表示例 给表添加数据 外部表示例 给表添加数据 外部表示例 用location指定表目录位置,那么表的位置在实际指定的位置,但是可以被映射 外部表和内部表的区别 删除表后使用show tables in shao; 已经没有被删除的表,说明元数据已经被删除(mysql里面存放),但是…...

2024收尾工作

目录 开场白 栈与队列 LeetCode232. 用栈实现队列 LeetCode225. 用队列实现栈 LeetCode102. 二叉树的层序遍历 LeetCode103. 二叉树的锯齿形层序遍历 堆&#xff08;优先级队列&#xff09; 堆排序 LeetCode215. 数组中的第 k 个最大元素 总结 开场白 今天是除夕&…...

能说说MyBatis的工作原理吗?

大家好&#xff0c;我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助&#xff1b; 能说说MyBatis的工作原理吗&#xff1f; MyBatis 是一款流行的持久层框架&#xff0c;它通过简化数据库操作&#xff0c;帮助开发者更高效地与数据库进行交互。MyBatis…...

简单的SQL语句的快速复习

语法的执行顺序 select 4 字段列表 from 1 表名列表 where 2 条件列表 group by 3 分组前过滤 having 分组后过滤 order by 5 排序字段列表 limit 6 分页参数 聚合函数 count 统计数量 max 最大值 min 最小值 avg 平均 sum 总和 分组查询使…...

Spring MVC 综合案例

目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…...

Spring Boot多环境配置实践指南

在开发Spring Boot应用时&#xff0c;我们常常需要根据不同的运行环境&#xff08;如开发环境、测试环境和生产环境&#xff09;来配置不同的参数。Spring Boot提供了非常灵活的多环境配置机制&#xff0c;通过使用profile-specific properties文件&#xff0c;我们可以轻松地管…...

微信小程序中实现进入页面时数字跳动效果(自定义animate-numbers组件)

微信小程序中实现进入页面时数字跳动效果 1. 组件定义,新建animate-numbers组件1.1 index.js1.2 wxml1.3 wxss 2. 使用组件 1. 组件定义,新建animate-numbers组件 1.1 index.js // components/animate-numbers/index.js Component({properties: {number: {type: Number,value…...

【huawei】云计算的备份和容灾

目录 1 备份和容灾 2 灾备的作用&#xff1f; ① 备份的作用 ② 容灾的作用 3 灾备的衡量指标 ① 数据恢复时间点&#xff08;RPO&#xff0c;Recoyery Point Objective&#xff09; ② 应用恢复时间&#xff08;RTO&#xff0c;Recoyery Time Objective&#xff09; 4…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...