当前位置: 首页 > 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…...

别再只测烟雾了!用STM32CubeMX+MQ-2传感器,做个厨房燃气泄漏+烟雾双检测器(附完整代码)

厨房安全卫士&#xff1a;基于STM32CubeMX与MQ-2的燃气烟雾双模检测系统 厨房是家庭安全事故的高发区域&#xff0c;燃气泄漏和烟雾积聚都可能引发严重后果。传统烟雾报警器功能单一&#xff0c;而市面上的复合型安防设备价格昂贵。本文将带你用STM32单片机和MQ-2气敏传感器&am…...

YOLO12入门必看:从上传图片到JSON结果输出完整操作流程

YOLO12入门必看&#xff1a;从上传图片到JSON结果输出完整操作流程 1. 引言&#xff1a;为什么你需要了解YOLO12&#xff1f; 如果你正在寻找一个既快又准的目标检测工具&#xff0c;那么YOLO12的出现&#xff0c;可能就是你一直在等的那个答案。 想象一下这样的场景&#x…...

Qwen3-VL:30B开源可部署优势展示:无需License、无调用限制、全链路私有化保障

Qwen3-VL:30B开源可部署优势展示&#xff1a;无需License、无调用限制、全链路私有化保障 1. 为什么你需要一个私有化的多模态大模型&#xff1f; 想象一下这个场景&#xff1a;你的团队需要处理大量产品图片&#xff0c;并生成对应的营销文案。你打开某个在线AI工具&#xf…...

如何突破设备限制?打造你的全场景跨平台开发中枢

如何突破设备限制&#xff1f;打造你的全场景跨平台开发中枢 【免费下载链接】code-server VS Code in the browser 项目地址: https://gitcode.com/GitHub_Trending/co/code-server 在多设备开发的时代&#xff0c;远程开发环境已成为连接不同终端的核心枢纽&#xff0…...

Neeshck-Z-lmage_LYX_v2多场景落地:LoRA动态加载赋能数字人直播背景实时生成系统

Neeshck-Z-lmage_LYX_v2多场景落地&#xff1a;LoRA动态加载赋能数字人直播背景实时生成系统 1. 项目简介&#xff1a;一个专为本地绘画优化的轻量级工具 如果你对AI绘画感兴趣&#xff0c;特别是想体验国产的Z-Image文生图模型&#xff0c;但又被复杂的部署流程、繁琐的参数…...

【实用工具教程专栏】GitHub Actions自动化工作流入门(基础篇)

引言 在现代软件开发中&#xff0c;持续集成与持续部署&#xff08;CI/CD&#xff09;已成为提升开发效率、保证代码质量的核心实践。GitHub Actions作为GitHub官方推出的自动化工作流平台&#xff0c;以其原生集成、灵活配置、丰富生态等特点&#xff0c;成为开发者构建自动化…...

DeEAR语音情感三维建模:如何用DeEAR输出可量化的Arousal-Nature-Prosody指标

DeEAR语音情感三维建模&#xff1a;如何用DeEAR输出可量化的Arousal-Nature-Prosody指标 1. 语音情感分析的新维度 传统语音情感识别系统通常只能识别"喜怒哀乐"等基础情绪&#xff0c;而DeEAR(Deep Emotional Expressiveness Recognition)系统通过wav2vec2深度学习…...

【限时开源】FastAPI 2.0 AI流式SDK v1.0:内置token计数、流控限速、断点续传、前端SSE自动重连——仅开放首批200个GitHub Star领取资格

第一章&#xff1a;FastAPI 2.0 异步 AI 流式响应的核心演进与架构定位FastAPI 2.0 将原生异步流式响应能力从实验性支持升级为一级公民&#xff0c;彻底重构了 AI 应用服务端的实时交互范式。其核心演进体现在对 StreamingResponse 的深度重写、对 ASGI 3.0 协议的精准适配&am…...

嵌入式NTP客户端库:高精度时间同步与自动时区管理

1. NTP客户端库深度解析&#xff1a;嵌入式系统中的高精度时间同步与时区管理1.1 库定位与工程价值NTP&#xff08;Network Time Protocol&#xff09;客户端库是嵌入式系统中实现网络时间同步的关键组件。该库并非简单封装UDP通信&#xff0c;而是构建了一套完整的“时间服务栈…...

MATLAB分类学习器保姆级教程:从鸢尾花数据集到模型导出全流程

MATLAB分类学习器实战指南&#xff1a;从鸢尾花分类到工业级模型部署 当你第一次面对MATLAB中那个名为"Classification Learner"的图标时&#xff0c;可能不会想到这个看似简单的交互式工具能够如此高效地完成从数据探索到生产级模型部署的全流程。不同于传统编程式机…...