《深入浅出MFC》2/e美国dengqi@glocom-us.com 侯俊杰先生:您好!从学校出来的七年间,我大多从事embedded system software 的设计。 在大陆,主要从事交换机系统软件的设计,到了美国,主要从事卫星通信地面站系统软件的 设计。程序设计主要结合C 和Assembly。在大陆,embedded system 多采用Intel 的 processor,在美国,embedded system 8086, 8051 系列及Motorola 68000 系列的assembly 语言比较熟悉,而对framework 这样的软件 制造思想和手段一直并不熟悉。近来偶有机会加入一个project,要生成在Win95 下运行的 代码,因此,想尝试一下使用framework 构造软件。很幸运,我找到了您的书。讲VC++ MFC 的书很多,但能像您这样做到「深入浅出」的,实在很少。看您的书,是享受。我手里这本 对一本如此高阶又如此高价的技术书籍而言,诚不易也。我有许多感触! 先从技术面谈起。我阅读过的VC++ 或MFC 书籍不算少,因此,我很有信心地说,这本书 的内容有其独步全球之处。本书企图引领读者进入MFC 这个十分庞大并在软件工具市场上 极端重要之application framework 的核心;我尝试剖析其中美好的对象导向性质(注1)的实 作方式,亦尝试剖析其中与Windows 程序设计模型(注2)息息相关之特殊性质(注3)的0 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南# 只有清理了 build 以后, • cmake -B build -DQt5_DIR=D:/Qt5 # 才需要重新指定。 科普:类似 Qt 这种亲 Unix 软件,在 Windows 下的目录组织格式 • 例如你安装 Qt 时设置安装路径为 D:/Qt5.12.1 。 • 则你会看到他下面有几个子目录: • D:/Qt5.12.1/msvc2017_64 同目录的限制,所以可以照常放到 lib 目录。 (他真的我哭死) 科普:类似 Qt 这种亲 Unix 软件,在 Linux 下的目录组织格式 • Linux 用户从源码安装 Qt 这种库时,会有一个 --prefix 选项,指定安装的根路径。 • 默认的 --prefix 是 /usr ,这个路径由全部软件共享, Qt 会把他的文件安装到以下目录: • /usr/include/qt/QtCore/qstring /usr/lib/cmake/Qt5/Qt5Config.cmake (包配置文件,用于 find_package ) • 假如你指定 --prefix=/usr/local ,这个路径通常是用户自己手动装的软件,那么就会变成: • /usr/local/lib/cmake/Qt5/Qt5Config.cmake • 假如你指定 --prefix=/opt/myqtroot ,那么就会变成: • /o0 码力 | 56 页 | 6.87 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 2 核 4 线程(并行课…) 英伟达家显卡( GPU 专题) 软件要求: Visual Studio 2019 ( Windows 用户) GCC 9 及以上( Linux 用户) CMake 3.12 及以上(跨平台作业) Git 2.x (作业上传到 GitHub 章:线程 进程与线程 • 进程是一个应用程序被操作系统拉起来加载到内存之后从开始执行到执行结束的这样一个 过程。简单来说,进程是程序(应用程序,可执行文件)的一次执行。比如双击打开一个 桌面应用软件就是开启了一个进程。 • 线程是进程中的一个实体,是被系统独立分配和调度的基本单位。也有说,线程是 CPU 可 执行调度的最小单位。也就是说,进程本身并不能获取 CPU 时间,只有它的线程才可以。 不同在于:他的解构函数里会 自动调用 join() 函数,从而保证 pool 解 构时会自动等待全部线程执行完毕。 小彭老师快乐吐槽时间 • 多线程、异步、无阻塞、并发,能提升程序响应速度,对现实世界中的软件工程至关重要 。 • 反面教材: blender 在运行物理解算的时候,界面会卡住,算完一帧后窗口才能刷新一遍 ,导致解算过程中基本别想做事,这一定程度上归功于 opengl 原始的单线程设计。0 码力 | 79 页 | 14.11 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南CMake 和古代 CMake 相比,使用 更方便,功能更强大。 为什么要学习现代 CMake ? 现代 CMake : 古代 CMake : 第 0 章:命令行小技巧 传统的 CMake 软件构建 / 安装方式 • mkdir build • cd build • cmake .. • make -j4 • sudo make install • cd .. • 需要先创建 是一个跨平台的构建系统,可以从 CMakeLists.txt 生成不同类型的构建系 统(比如 Linux 的 make , Windows 的 MSBuild ),从而让构建规则可以只写一份,跨平 台使用。 • 过去的软件(例如 TBB )要跨平台,只好 Makefile 的构建规则写一份, MSBuild 也写一份 。 • 现在只需要写一次 CMakeLists.txt ,他会视不同的操作系统,生成不同构建系统的规则文件。 图形界面编辑各个缓存选项。 • 当然,直接用编辑器打开 build/CMakeCache.txt 修改后保存也是可以的。 • CMakeCache.txt 用文本存储数据,就是可供用 户手动编辑,或是被第三方软件打开并解析的。 缓存变量到底该如何更新?暴力解决:删 build 大法 用万能的“删 build 大法”当然是可以的。这样重新执行的时候缓存变量不存在, 从而 set 会重新设置缓存的值为 world0 码力 | 166 页 | 6.54 MB | 1 年前3
Hello 算法 1.0.0b2 C++版当然,由于结点需要额外存储指针,因此 链表结点比数组元素占用更大。 综上,我们不能简单地确定哪种实现更加省内存,需要 case‑by‑case 地分析。 5.1.4. 栈典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就将上一个网页执行 入栈,这样我们就可以通过「后退」操作来回到上一页面,后退操作实际上是在执行出栈。如果要同时 支持后退和前进,那么则需要两个栈来配合实现。 双向队列同时表现出栈与队列的逻辑,因此可以实现两者的所有应用,并且提供更高的自由度。 我们知道,软件的“撤销”功能需要使用栈来实现;系统把每一次更改操作 push 到栈中,然后通过 pop 实现 撤销。然而,考虑到系统资源有限,软件一般会限制撤销的步数(例如仅允许保存 50 步),那么当栈的长度 > 50 时,软件就需要在栈底(即队首)执行删除,但栈无法实现,此时就需要使用双向队列来替代栈。注 意,“0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b4 C++版然而,由于链表节点需要额外存储指针,因此链表节点占用的空间相对较大。 综上,我们不能简单地确定哪种实现更加节省内存,需要针对具体情况进行分析。 5.1.4. 栈典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会将上一个网页执 行入栈,这样我们就可以通过「后退」操作回到上一页面。后退操作实际上是在执行出栈。如果要同时 支持后退和前进,那么需要两个栈来配合实现。 双向队列兼具栈与队列的逻辑,因此它可以实现这两者的所有应用场景,同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(即队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。 请0 码力 | 343 页 | 27.39 MB | 1 年前3
面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭“这别人写的代码,不关我事” 大量报告引起不适 刚写的代码立即自动扫描,程序员强迫使用 只体现新增代码问题,责任边界清晰 评审流程多人督促 渐进式开启更多检查器 增量分析减少不适 • 软件工程师一天被邀请进行多次 代码评审,这些都不是他们自身 的KPI • 一旦工期紧996,人工评审容易 变成走形式 • 任务挂着还容易造成工程师焦虑 降低工程师劳动强度 大规模C/C++静态代码评审系统搭建0 码力 | 39 页 | 6.88 MB | 1 年前3
Hello 算法 1.1.0 C++ 版然而,由于链表节点需要额外存储指针,因此链表节点占用的空间相对较大。 综上,我们不能简单地确定哪种实现更加节省内存,需要针对具体情况进行分析。 5.1.4 栈的典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会对上一个网页执 行入栈,这样我们就可以通过后退操作回到上一个网页。后退操作实际上是在执行出栈。如果要同时支 持后退和前进,那么需要两个栈来配合实现。 双向队列兼具栈与队列的逻辑,因此它可以实现这两者的所有应用场景,同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。请 注0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0b5 C++版然而,由于链表节点需要额外存储指针,因此链表节点占用的空间相对较大。 综上,我们不能简单地确定哪种实现更加节省内存,需要针对具体情况进行分析。 5.1.4 栈典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会将上一个网页执 行入栈,这样我们就可以通过后退操作回到上一页面。后退操作实际上是在执行出栈。如果要同时支持 后退和前进,那么需要两个栈来配合实现。 双向队列兼具栈与队列的逻辑,因此它可以实现这两者的所有应用场景,同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(即队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。 请0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.0.0 C++版然而,由于链表节点需要额外存储指针,因此链表节点占用的空间相对较大。 综上,我们不能简单地确定哪种实现更加节省内存,需要针对具体情况进行分析。 5.1.4 栈的典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会对上一个网页执 行入栈,这样我们就可以通过后退操作回到上一个网页。后退操作实际上是在执行出栈。如果要同时支 持后退和前进,那么需要两个栈来配合实现。 双向队列兼具栈与队列的逻辑,因此它可以实现这两者的所有应用场景,同时提供更高的自由度。 我们知道,软件的“撤销”功能通常使用栈来实现:系统将每次更改操作 push 到栈中,然后通过 pop 实现撤 销。然而,考虑到系统资源的限制,软件通常会限制撤销的步数(例如仅允许保存 50 步)。当栈的长度超过 50 时,软件需要在栈底(队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。请 注0 码力 | 378 页 | 17.59 MB | 1 年前3
共 19 条
- 1
- 2













