关于《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,我都会公布在我的读者俱乐部中(书最后有地址),同时也会不断应用到新一版的印刷中。
真理越辩越明,希望大家不吝赐教。我在此先行谢过!

本文转自 tonyxiaohome 51CTO博客,原文链接: http://blog.51cto.com/tonyxiaohome/254129 ,如需转载请自行联系原作者

相关文章
|
8月前
|
程序员 API 数据库
【Cmake工程 库相关教程 】深入理解CMake工程C/C++ 库管理技巧
【Cmake工程 库相关教程 】深入理解CMake工程C/C++ 库管理技巧
186 1
|
8月前
|
IDE 编译器 开发工具
C/C++ IDE环境 (Qt Creator visual studio等) Cmake工程不显示头文件的解决方案
C/C++ IDE环境 (Qt Creator visual studio等) Cmake工程不显示头文件的解决方案
280 0
|
8月前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
505 0
|
7月前
|
编解码 C++
cocos2d-x C++ 工程初探
cocos2d-x C++ 工程初探
|
6月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
293 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
8月前
|
数据可视化 算法 C++
C++ cmake工程引入qt6和Quick 教程
C++ cmake工程引入qt6和Quick 教程
519 0
|
8月前
|
算法 测试技术 C++
【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现
【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现
87 0
|
8月前
|
C++
[C++] 获取工程路径、解决方案路径和.exe路径
[C++] 获取工程路径、解决方案路径和.exe路径
216 1
|
数据库 C++
《C++避坑神器·十七》找到程序崩溃Bug的一个实用方法:dump调试
《C++避坑神器·十七》找到程序崩溃Bug的一个实用方法:dump调试
172 0
|
IDE 编译器 开发工具
善用 vs 中的错误列表和输出窗口,高效查找 C++ 多工程编译错误
善用 vs 中的错误列表和输出窗口,高效查找 C++ 多工程编译错误

相关实验场景

更多