摘要:
代码之外的功夫 善用设计原型,探索项目创意 从理解项目背后的需求入手 细节问题都可以暂时搁置,现在应该几种精力探讨这个想法究竟是否可行 利用线框图表达功能需求 你可以通过线框图向大家解释待开发应用的基本结构,同时让大家都了解需要完成什么工作,以免过度关注技术细节而迷失了大方向 编程之初立即搭建测试系 阅读全文
摘要:
运行库实现 C语言运行库 开始 入口函数 程序运行的最初入口点不是main函数,而是由运行库为其提供的入口函数。主要负责:准备好程序运行环境及初始化运行库,调用main函数执行程序主体,清理程序运行后的各种资源。 运行库为所有程序提供的入口函数应该相同,在链接程序时需要指定该入口函数名。 堆的实现 阅读全文
摘要:
系统调用与API 系统调用介绍 什么是系统调用 Linux系统调用 系统调用的弊端 使用不便:操作系统提供的系统调用接口往往过于原始,程序员需要了解很多与操作系统相关的细节。如果没有进行很好的包装,使用起来不方便。 各个操作系统之间系统调用不兼容。 运行库就是用来解决以上弊端的。 系统调用原理 特权 阅读全文
摘要:
运行库 入口函数和程序初始化 程序并非从main函数开始,首先运行的代码是入口函数,负责准备好main函数执行所需要的环境,并且负责调用main函数。 GLIBC入口函数和MSVC CRT入口函数的实现略 I/O指代任何操作系统理解为文件的事务。在Linux里有文件描述符(File Descript 阅读全文
摘要:
内存 程序的内存布局 内核空间 用户空间 栈:用于维护函数调用的上下文 堆:用来容纳应用程序动态分配的内存区域 可执行文件映像 保留区:对内存中受到保护而禁止访问的内存区域的总称,比如nullptr。 栈与调用惯例 栈保存了一个函数调用所需要的维护信息,叫堆栈帧(Stack Frame)或活动记录( 阅读全文
摘要:
Windows下的动态链接 DLL简介 DLL的设计目的与共享对象有些出入,DLL更加强调模块化,即微软希望通过DLL机制加强软件的模块化设计,使得各种模块之间能够松散地组合、重用和升级。 进程地址空间和内存管理:进程拥有独立的地址空间 基地址(Base Address)和相对地址(RVA, Rel 阅读全文
摘要:
Linux共享库的组织 共享库版本 共享库兼容性 兼容更新:增加接口、修复Bug/不兼容更新:修改和删除接口 这里讨论的接口:ABI(Application Binary Interface) 对于C++来说,ABI兼容问题比较严重。 共享库版本命名 主版本号:不兼容的重大升级 次版本号:兼容的增量 阅读全文
摘要:
优化内存管理 复习C++内存管理器API 动态变量的生命周期 动态变量有五个唯一的生命阶段。最常见的new表达式的各种重载形式执行分配和放置生命阶段。在使用阶段后,delete表达式会执行销毁和释放阶段。C++提供了单独管理每个阶段的方法。 分配(malloc、new) 程序要求内存管理器返回一个指 阅读全文
摘要:
优化I/O 写在开头 读写文件是再普通不过的活动了,以至于开发人员往往忽略了它们,但是实际上它们确实非常耗时的程序活动 互联网世界受限于数据传输速率和繁忙的服务器,响应延迟可能是以毫秒而非秒计量的。当数据传向远方的计算机时,即使是光速传输,传输时间也会成为一个影响性能的因素。 I/O的另外一个问题是 阅读全文
摘要:
优化数据结构 理解标准库容器 序列容器 stdstring、stdvector、stddeque、stdlist、std::forward_list 前三个容器能通过下标访问,而后两个容器不能 除了最后一个容器,push_back具有常量时间开销 只有后三个容器有高效的push_front方法 前三 阅读全文