我是一条内存

visual studio 2017编译Triangle库遇到的问题和解决办法 这段时间因为一个项目需要使用到Triangle这个三角剖分工具,需要在windows环境下进行对源码编译,中间踩了很多坑,特此记录下。 1、下载 下载链接是下边这个,需要翻墙 http://www.cs.cmu.edu/~quake/triangle.html 2、编译。。超。。。级。。。麻。。。烦。。。 在ubutu下安装一切顺利,完全没遇到什么麻烦,但是换到windows下就麻烦不断... 阅读详情

我从无边无尽的黑暗中慢慢醒来,迷迷糊糊,茫然四顾。

耳边传来了风扇卖力干活的嗡嗡声,估计就是他把我吵醒的。 这时候 CPU阿甘 现身了:“兄弟,快醒醒,开机了,要干活了,我要把程序和数据从硬盘读取到你这里来了!”

“放到我这里干嘛?”

“唉,一断电,你什么都忘了,不把程序读入内存,我怎么执行啊?”

奥,对了,我是内存啊,阿甘是我的好基友,虽然说程序都在硬盘上存着,但是阿甘被设计成只能运行我内存中的程序,所以程序必须要装载进来。

在这个系统里,阿甘最快,我第二, 硬盘则慢如蜗牛,他整天叫嚣着说要提高访问速度,到时候可以把我彻底替换掉, 但是这么多年过去了,还是没有什么进展。

不知道等了多长时间,阿甘终于把一个叫做Linux的操作系统给装载到我这里来了,阿甘说从此以后它就是这里的老大。

可是我却感觉不到老大的存在,我只知道我那一个个电容所代表的0和1 ,由于这些电容不能持久地保持电荷,我得定期地去刷新,如果不及时刷新,那些0和1的数据就会丢失,这将是极为严重的事故,主人就会把我从主板上拔掉,用另外一个家伙来替换我,决不允许这样的事情发生!

次序问题

但是程序员们却不管什么电容,什么刷新,在他们的眼里,我就是一个个的空格子,每个格子有个唯一的地址,就像门牌号一样。

我最小的一个格子就是一个bit ,只能存储0和1,这实在是太小了, 人们把8个bit 称为一个字节(Byte), 就可以表达2的8次方种可能,从00000000 到 11111111, 如果是无符号数的话,就是0~255。

很明显,Byte还是太小,人们又把更多的字节(比如4个)组织起来,叫做一个Word(字) 。

640?wx_fmt=gif640?wx_fmt=png

字节数目一多,就出现了很有意思的问题,比如说有个整数,十六进制的值是0x1234567, 一共是四个字节,那该以什么次序存储他们呢?

一种办法是这样:

640?wx_fmt=gif

640?wx_fmt=png

还有一种方法是这样:

640?wx_fmt=png640?wx_fmt=gif

可笑的是人类为这两种方式争执不休,有人坚决支持第一种(即大端法),有人则捍卫第二种(即小端法),还有些和稀泥的家伙,大端小端都支持,就看你怎么选择和配置了。

我问CPU阿甘:“如果两个机器的字节次序不同,他们两个通信的时候,岂不天下大乱?”

阿甘叹息一声:“唉,他们在制定TCP/IP的时候,确定了统一的网络次序,使用大端法来传输数据。操作系统老大会提供特定的函数来实现网络和主机之间字节次序的转换,比如 htonl 函数,就可以把32位整数由主机字节次序转换为网络字节次序, ntohl则恰恰相反。 ”

编译器

刚才说到,内存中每个字节都有一个唯一的地址,只要能记住这个地址就可以把这个字节的值给取走,或者写入一个值。

比如说,刚才CPU阿甘执行了一些列的指令, 它把地址0x100处的值取出来,和 0x104处的值相加,放到0x110处, 然后再和0x108处的值相乘,结果放到0x10C处。

这一系列操作搞得我眼花缭乱,我对CPU阿甘说:“这程序员真是很厉害,居然能够记住这么多地址!”

阿甘说:“怎么可能? 他们笨得很,根本记不住,全靠了编译器的帮忙。”

“编译器? ”

“是啊,编译器允许程序员用变量的方式来表达程序,它可以把这些变量转换成地址。没有编译器,程序员将会像熊猫一样稀少。”

total = base + bonus

tax = total * rate

640?wx_fmt=gif

640?wx_fmt=png

原来如此,我这里看到的都是二进制的值,没想到程序员都给他们起了一个名字。

信息 = 位 + 上下文

有一次, 阿甘问我地址0x300的值是多少,我看了一眼,告诉他说是一个32位整数1735159650。

阿甘大惊失色:“兄弟,你睡了一觉什么忘了吗, 你不能擅自去解释你内存数据的类型啊!”

“为什么? 这就是个整数嘛!”

“你这里的值实际上是0x 676C 6F62,他有可能是32位整数1735159650,也有可能是浮点数 1.116533*10^24,还有可能是机器指令呢!!记住!解释权不在你,而在人家应用程序那里,你就管好你电容里的'二进制'就行!”

我觉得很羞愧,这么重要的准则都给忘记了!

信息=位+上下文,  我这里只负责一串串的二进制位,至于这些位的信息是什么,得加上下文才能理解了。

指针

过了一会儿,阿甘问我0x108处存了什么内容, 这一次我不再“解释”了,我告诉他是0x100。

奇怪的是他接下来又问我0x100处的值是什么, 我告诉他说是0x12C, 他这才满意地离开。

640?wx_fmt=gif

640?wx_fmt=png

我拉着他问道:“你这次怎么了,这么麻烦?还得读两次才行?”

他说:“没办法,程序员用指针了!”

int i  = 300;

int *p = &i

total = *p + 200;

640?wx_fmt=gif

640?wx_fmt=png

“看到没有,这个变量p就表示指针。”

我吓了一跳:“难道我的格子里保存的不仅仅是值,而是地址?”

“是啊,这就再次证明,你不要胡乱解释你保存的值。 我告诉你,有时候还会出现二级指针呢。”

int i  = 300;

int *p = &i ;

int **pp = &p;

640?wx_fmt=gif

640?wx_fmt=png

这真是颠覆了我的认知,我还是刷新我的电容去吧!

不过,在亿万次的读写操作中,我通过这些指针的关系,也发现了一些独特的模式,比如说我发现这样的东西很常见:

640?wx_fmt=png

640?wx_fmt=gif

我问阿甘:“这是在干嘛? ”

“这就是程序员实现的链表啊。”

“ 那这个东西呢?”

640?wx_fmt=gif

640?wx_fmt=png

阿甘说:“这不就是一颗二叉树嘛! 程序员管这些东西叫做数据结构。”

我原来以为,我就是一个大数组而已,没想到通过指针,可以表达各种各样的复杂的数据结构的,只要你能沿着指针来回跳转就行。

但是我心里隐隐觉得不妥,这指针实在是太强大了,程序员可以把它指向任何地方,我知道有些地方是操作系统老大的独有区域,是严禁外界进入的,万一指针指到这里会发生什么事?

阿甘说:“这不用你操心,如果有个程序通过指针想访问它根本没有权限的区域,老大就会引发一个segment fault,把这个程序杀死!”

“杀死以后呢?”

“那个程序的内存空间就会被释放, 与此同时老大会生成一个叫做core dump的文件,让程序员们去分析。 唉,今天你真是烦人,问了这么多问题。 不说了,主人要关机了,明天再见!”

风扇停转,电流消失,整个世界安静了。

第二天

我从无边无尽的黑暗中慢慢醒来,迷迷糊糊,茫然四顾。

耳边传来了风扇卖力干活的嗡嗡声,估计就是他把我吵醒的。 这时候CPU阿甘现身了:“兄弟,快醒醒,开机了,要干活了,我要把程序和数据从硬盘读取到你这里来了!”

......

后记:本文的部分素材来源于《深入理解计算机系统》和《C和指针》, 这是两本非常不错的书,推荐给大家。 

你可能会喜欢

关于老刘和码农翻身

我是一个线程

我是一个Java Class

CPU阿甘

面向对象圣经

TCP/IP之大明邮差

CPU阿甘

负载均衡的原理

一个故事讲完HTTPs

编程语言的巅峰

Java:一个帝国的诞生

JavaScript:一个屌丝的逆袭

C语言:春节回家,我发现只有我没有对象

《深入理解计算机系统》这本神书到底好在哪儿?

640?wx_fmt=jpeg

用友U8其中一个账套提示演示期已到期-修复方法 【事件始末】 一朋友求助,反馈使用的用友U8,很多年了! 突然发现其中账套2021年的一个账套打不开,提示演示期限已到期! 但是其他账套完全正常,可以打开,没有任何问题。 不管是还原老旧备份,还是重装软件问题依旧,无法自己解决。 客户查询报表结算账期,情况比较紧急,于是求助我们。 经过多次反复琢磨和烟酒,终于于晚上23点59分给弄了出来,也总是圆满解决问题了。 【问题分析】 该用户打的是 U82X免狗补丁,估计是该补丁文件设置了 最大有效期,补丁到期了导致的。 也有可能是程序... 阅读详情

相关推荐

Simulink与C/C++的无缝对接:自定义结构体变量导入实战指南

本文详细介绍了如何将C/C++自定义结构体导入Simulink环境,实现无缝数据对接。通过编写标准C头文件、配置MEX编译环境(如MinGW),并利用`Simulink.importExternalCTypes`函数,可将结构体转换为Simulink Bus对象,从而提升复杂系统模型的可读性、可维护性及仿真与代码生成效率。

weixin_29093017的博客 481

一块硬盘的爱情故事——完整版(转帖)

n年前的帖子了,不过还是很喜欢。整理了一下,还是比较全的。但一直不知道原作者是谁,网上也搜不到 :(如果谁知道,麻烦告诉我一下目录:我是一个硬盘我是DM我是一块CPU我是一条内存我是一块声卡我是一个机箱我是BIOS我是一个笔记本硬盘我是一块主板 我是一个硬盘 我是一个硬盘,st380021a,在一个普普通通的台式机里工作。别人总认为我们是高科技白领,工作又干净又体面,似乎风光得很。也许他们是因为看...

记录学习中的点滴 662

Pwntools不只是PWN:用它写个自动化Fuzz脚本,挖掘Linux命令行工具漏洞

本文探讨了如何利用Pwntools构建自动化Fuzz脚本,挖掘Linux命令行工具中的漏洞。通过详细的代码示例和实战案例,展示了Pwntools在Fuzzing中的高效性和灵活性,特别适合快速验证特定场景的安全问题。文章还提供了进阶技巧和避坑指南,帮助安全研究人员快速上手并提升测试效率。

weixin_28718345的博客 221

欢子的小木屋: 我是一个硬盘(转载)

我是一个硬盘(开始以为是一个笑话,看到最后才发现很感人) 我是一个硬盘。 在一个普普通通的台式机里工作。别人总认为我们是高科技白领,工作又干净又体面,似乎风光得很。也许他们是因为看到洁白漂亮的机箱才有这样的错觉吧。其实象我们这样的小台式机,工作环境狭迫,里面的灰尘吓得死人。每天生活死水一潭,工作机械重复。跑跑文字处理看看电影还凑活,真要遇到什么大软件和游戏上上下下就要忙的团团转,最后还常常

eltonzhao的专栏 770

手把手教你用ObjectCRX进行Caxa二次开发:从零开始的环境搭建教程

本文是一份面向零基础初学者的Caxa二次开发实战指南,重点讲解如何使用ObjectCRX框架从零开始搭建开发环境。内容涵盖Visual Studio 2015版本锁定、ObjectCRX向导集成、项目创建、典型错误解决,并最终实现一个可在Caxa中运行的HelloWorld程序,帮助开发者快速入门并避开常见陷阱。

w3x4y的博客 512

OpenWRT二级路由DHCP客户端配置:实现IPv4 WAN自动获取与网段隔离

本文详细讲解了如何将OpenWRT配置为二级路由器,重点在于设置其WAN口为DHCP客户端以自动获取IPv4地址,并修改LAN口网段实现与上级网络的隔离。文章提供了从网络拓扑规划、具体配置步骤到防火墙设置的完整指南,并分享了常见问题排查与避坑经验,帮助用户构建稳定且功能独立的家庭网络环境。

weixin_29268267的博客 293

我是一条内存!

发信人: hry (hry), 信区: Joke标  题: 我是一条内存!发信站: 派派 BBS (Sat Apr 16 19:05:44 2005), 本站(sopai.net)我是一条内存,我在一台台式电脑里工作,但是我记不得我是从哪里来的,是什么牌子,因为我健忘。我的上司是cpu大哥,他是我们的老大。都说他是电脑的脑子,可是我看他的脑子实在是太小了,比我还要健忘。每天他总是不停的问我,某某页

乐天的专栏 896

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

码农翻身讲操作系统1:CPU与内存的那些事

转自码农翻身 本系列文章全部摘选自“码农翻身”公众号,仅供个人学习和分享之用。文章会给出原文的链接地址,希望不会涉及到版权问题。 个人感言:真正的知识是深入浅出的,码农翻身”公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解。感谢“码农翻身”公共号,感谢你们的成果,谢谢你们的分享。 本文源地址:http://mp.weixin.qq.com/s?__b...

Java技术江湖 1905

【ArcGIS微课1000例】0066:图像融合(全色+多光谱)操作案例教程

图像融合是指将不同类型传感器的影像进行融合,既能使图向具有较高的空间分辨率,又具有多光谱的特性。除了遥感软件如Erdas能进行图像融合,ArcGIS软件也可以进行图像融合等图像增强操作。

智慧空间实验室 3077

解读 2025《高质量数据集 质量评测规范》

《高质量数据集质量评测规范》为2025年数据质量评估提供标准化框架,适用于政府部门、AI企业、数据服务商等行业主体。规范以"说明文档-数据质量-模型应用"三维体系为核心:明确定义高质量数据集分类,细化各项指标要求(包括文档完整性、数据规范性、应用多样性等),并提供具体评分细则(百分制,90分达标)和计算方法。附录补充多模态数据处理细则,旨在建立可操作的质量评估标准,保障优质数据供给流通。

cdfunlove的博客 1887

【一条进程的区在内存中的映射】与【一条进程在内存中的映射】的区别

一条进程的栈区、堆区、数据区和代码区在内存中的映射     1>栈区:主要用来存放局部变量, 传递参数, 存放函数的返回地址。.esp 始终指向栈顶, 栈中的数据越多, esp的值越小。     2>堆区:用于存放动态分配的对象, 当你使用 malloc和new 等进行分配时,所得到的空间就在堆中。动态分配得到的内存区域附带有分配信息, 所以你  能够 free和delete它们。  ...

夏沐的博客 288

STM32(HAL库)驱动OLED

通过STM32F103C8T6单片机采用HAL库方式对0.96寸OLED(IIC通讯)屏幕进行驱动。

weixin_44597885的博客 8801

我是一条内存 (ZT)

趣味美文一条内存的自白 我是一条内存 2005.08.23 <!-- csdn_AD_Position_GroupID = "{e025b96b-2fda-4e82-84ef-3e0772838ed3}"; csdn_AD_Page_Url = document.location; csdn_AD_CurrPage_CharSet = "gb2312"

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1005

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[小说]我是一条内存

我是一条内存,我在一台台式电脑里工作,但是我记不得我是从哪里来的,是什么牌 子,因为我健忘。我的上司是cpu大哥,他是我们的老大。都说他是电脑的脑子,可 是我看他的脑子实在是太小了,比我还要健忘。每天他总是不停的问我,某某页某某 地址存的是什么?我总是不厌其烦的告诉他,可是不出一秒钟他又忘记了,又要问一 遍,一次我说大哥你烦不烦,你就不能记住点有用的东西?他说“内存兄弟,我有苦 衷啊,每天都在不停

XiaojunWu的Blog 2171

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

世界上第一条计算机诞生于哪里,世界上第一条内存是什么样子的?你知道吗?...

导读现代内存无论速度还是容量都较比之前提升很多,内存的作用更是如今家用手机电脑的重要组成部分,内存是最主要的系统存储器,用来加载各式各样的程序与数据以供CPU直接运行与运用。大家都知道世界上第一台通用计算机“ENIAC”于1946年2月14日在美国宾夕法尼亚大学诞生,但是你知道世界上第一条内存用于计算设备是什么样子的吗?内存始祖谈到世界上第一条内存,是世界上无数物理学家与计算专家等多个领域共同合作...

weixin_29552845的博客 1285

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何一条命令,榨干机器的所有内存?

最近在验证一些机器的内存分配规律的时候,学习到了一些技能,趁着周末有时间写点东西,跟大家分享一下。 大家可能有遇到类似的场景,想要对机器进行压测模拟 OOM 的场景,但是无奈机器的规格实在太高,若用代码去实现,大家可以想象一下如何实现?个人感觉还是有点麻烦的。 那么有没有好有的办法,不用写代码,用几个简单的命令直接就可以向机器申请内存呢?或者更极端点,直接把机器的内存给榨干了。。 若你经常使用 linux,你会发现 df -Th 后,一定会有 tmpfs 类型的文件系统挂载在 /dev/shm 下面,虽然你

王炳明 9184
上一篇: 这些优秀的年轻人
下一篇: 反模式:神仙大类和黄金大锤
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值