关于《0 bug -- C/C++商用工程之道》的一处bug

这两天有很多朋友已经买了书了,并且开始看,呵呵,我心里也很高兴。
嗯,要说江湖上藏龙卧虎呢,这不,这才几天时间,已经有朋友指出我书中的一处明显错误,这里我正式给大家说明一下,免得对各位读者有个不好的误导。
问题出在第26页的一个图以及其相关文字。这是第二章基础知识的第一节,其实就是关于内存的讲解,大家可以直接在样章中看到。
这论坛里面不好贴图,我就不直接画图给大家看了,简单说,我在书中论述:“ 32位操作系统下,每个进程空间有4G内存的连续地址可用,其中,高2G是系统使用,低2G是应用程序本身使用,另外,在低2G中,应用程序运行栈在下,即低位地址空间,从下向上生长,堆在上,从上向下分配,什么时候二者碰到一起,什么时候内存就满了,无法运行程序了”。
应该说,我这个说法是不对的,至少是不严谨,因为32位多任务操作系统多种多样,各家操作系统,各家编译器编译出来的运行结果,其实都不一样,我把话说得这么绝对,肯定有问题。这个呢,主要是我写书时不严谨,没有仔细查证资料,写随手了,导致了bug。这里给所有读者先道个歉,下次印刷时,我会和编辑修订这个问题。
我最近查了一下,32位多任务操作系统差别还是很大的,Windows主要是按照2G+2G的分配方式,即操作系统的代码占用2G地址编码,应用程序本身的代码,占用2G,Linux下,则是1G+3G的分配方式,操作系统只占1G地址空间,其它都给应用程序用。
因此,上文简单论述2G+2G,不准确,起码不符合所有操作系统的情况。
“堆在上,栈在下”的理解呢,我更多是来自16位时代的编译器习惯,32位以后情况发生了很大变化,我做了一下试验,VC和gcc均是“堆在下,向上分配,栈在上,向下生长”,和我书中说法是反的。因此必须修订。
我想,这段知识这么理解可能更好,就是应该更加抽象地论述这个问题,而不要说得这么精确。
32位操作系统下,每个进程空间有4G内存的连续地址可用,其中,有一部分地址空间被系统使用,剩余部分是应用程序本身使用,另外,在应用程序空间中,至少分为程序运行栈和内存堆两个部分,这两部分内存根据应用程序自身运行情况,不断被申请使用和释放,如果二者发生干涉,则表示内存空间耗完,程序将无法运行。
我在第二章基础知识的本意,是用简单的描述,使各位读者快速对32位操作系统有一个统揽,关于内存的描述,更多的是希望大家能理解上面这几个概念,堆,栈,系统区,应用 程序区等,主要有这么个抽象理解,就足够了,已经能继续理解下面的文字和代码了,至于具体每个区到底是分配到哪个地址区间段,确实各个操作系统,各个编译器都不太一样,因此,大家不必细究。
嗯,再次感谢提出批评的读者,也希望大家继续为本书查找bug,我本意是给大家奉献一部精品,但是,就像写程序一样,一本书出来,仅仅靠我和编辑两个人过,由于我们水平有限,成书时间偏短,肯定有不少错漏。不过,我想没关系,每个被确认的bug,我都会公布在我的读者俱乐部中(书最后有地址),同时也会不断应用到新一版的印刷中。
真理越辩越明,希望大家不吝赐教。我在此先行谢过!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值