跟我学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位的处理
一、计算机的发展 计算机从二进制为基础开始描述整个世界,但正如现实世界一样,十进制为主的世界也会有万千百概念。所以在实际的应用中,会出现32位和64位的计算机系统。当然,前面还有过16位、8位和4位等,以后还可以会…...

指针的介绍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之后,会在Windows系统中虚拟出两个虚拟网卡,如下: VMware提供了三种网络模式,分别是:桥接模式(Bridged)、NAT…...

Ubuntu x64下交叉编译ffmpeg、sdl2到目标架构为aarch64架构的系统(生成ffmpeg、ffprobe、ffplay)
一、编译SDL2-2.0.9 (1), ./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语言基础)文件的随机读写
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 fseek 根据文件指针的位置和偏移量来定位文件指针 示例: 这个输出的就是ade seek_cur的意思是从当前偏移量 2就是从a往后偏移两个就是d 偏移量 SEEK_CUR…...

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

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

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

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

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

2025神奇的数字—新年快乐
2025年,一个神奇的数字,承载着数学的奥秘与无限可能。它是45的平方(45),上一个这样的年份是1936年(44),下一个则是2116年(46),一生仅此一次。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. 二叉树的锯齿形层序遍历 堆(优先级队列) 堆排序 LeetCode215. 数组中的第 k 个最大元素 总结 开场白 今天是除夕&…...

能说说MyBatis的工作原理吗?
大家好,我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助; 能说说MyBatis的工作原理吗? MyBatis 是一款流行的持久层框架,它通过简化数据库操作,帮助开发者更高效地与数据库进行交互。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应用时,我们常常需要根据不同的运行环境(如开发环境、测试环境和生产环境)来配置不同的参数。Spring Boot提供了非常灵活的多环境配置机制,通过使用profile-specific properties文件,我们可以轻松地管…...

微信小程序中实现进入页面时数字跳动效果(自定义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 灾备的作用? ① 备份的作用 ② 容灾的作用 3 灾备的衡量指标 ① 数据恢复时间点(RPO,Recoyery Point Objective) ② 应用恢复时间(RTO,Recoyery Time Objective) 4…...

Vue.js组件开发-实现下载时暂停恢复下载
在 Vue 中实现下载时暂停和恢复功能,通常可以借助 XMLHttpRequest 对象来控制下载过程。XMLHttpRequest 允许在下载过程中暂停和继续请求。 实现步骤 创建 Vue 组件:创建一个 Vue 组件,包含下载、暂停和恢复按钮。初始化 XMLHttpRequest 对…...

TCP是怎么判断丢包的?
丢包在复杂的网络环境中,是一种常见的现象。 TCP(传输控制协议)作为一种可靠传输协议,内置了多种机制来检测和处理丢包现象,从而保证数据的完整性和传输的可靠性。本文将介绍TCP判断丢包的原理和机制。 一、TCP可靠传…...

python爬虫入门(一) - requests库与re库,一个简单的爬虫程序
目录 web请求与requests库 1. web请求 1.1 客户端渲染与服务端渲染 1.2 抓包 1.3 HTTP状态代码 2. requests库 2.1 requests模块的下载 2.2 发送请求头与请求参数 2.3 GET请求与POST请求 GET请求的例子: POST请求的例子: 3. 案例:…...

2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型
2025年数学建模美赛 A题分析(1)Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析(2)楼梯磨损分析模型 2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...

复古壁纸中棕色系和米色系哪个更受欢迎?
根据最新的搜索结果,我们可以看到棕色系和米色系在复古壁纸设计中都非常受欢迎。以下是对这两种颜色系受欢迎程度的分析: 棕色系 受欢迎程度:棕色系在复古壁纸中非常受欢迎,因为它能够营造出温暖、质朴和自然的氛围。棕色系的壁纸…...

编译安装PaddleClas@openKylin(失败,安装好后报错缺scikit-learn)
编译安装 前置需求: 手工安装swig和faiss-cpu pip install swig pip install faiss-cpu 小技巧,pip编译安装的时候,可以加上--jobs64来多核编译。 注意先升级pip版本:pip install pip -U pip3 install faiss-cpu --config-s…...

t113_can增加驱动
1 基于太极派的SDK添加 //设备树添加can0: can2504000 {compatible "allwinner,sun20i-d1-can";reg <0x0 0x02504000 0x0 0x400>;interrupts <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;clocks <&ccu CLK_BUS_CAN0>;resets <&ccu RST_BUS_…...

达梦数据库建用户,键库脚本
-- 1.创建表空间 CREATE TABLESPACE "表空间名称" DATAFILE /dmdata/data/DAMENG/表空间名称.DBF SIZE 512 AUTOEXTEND ON NEXT 512 MAXSIZE UNLIMITED; -- 2.创建用户 CREATE USER "表空间名称" IDENTIFIED BY "表空间名称" HASH WITH SHA512 S…...

上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天冲高回落,深成指、创业板指午后翻绿。大金融板块全天强势,天茂集团…...

MySQL 的索引类型【图文并茂】
基本分类 文本生成MindMap:https://app.pollyoyo.com/planttext <style> mindmapDiagram {node {BackgroundColor yellow}:depth(0) {BackGroundColor SkyBlue}:depth(1) {BackGroundColor lightGreen} } </style> * MySQL 索引** 数据结构角度 *** B树索引*** 哈…...