C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串换行符:另起一行(光标移到下一行行首) • ‘\r’ 回车符:光标移到行首(覆盖原来的字符) • ‘\t’ 缩进符:光标横坐标对齐到 8 的整数倍 • ‘\b’ 退格符:光标左移,删除上个字符 • ‘\\’ 反斜杠:表示这个是真的 \ ,不是转义符 • ‘\”’ 双引号:在字符串常量中使用,防止歧义 • ‘\’’ 单引号:在字符常量中使用,防止歧义 • ‘\0’ 空字符:标记字符串结尾,等价于 0 • 换行符:另起一行(光标移到下一行行首) • ‘\r’ 回车符:光标移到行首(覆盖原来的字符) • ‘\t’ 缩进符:光标横坐标对齐到 8 的整数倍 • ‘\b’ 退格符:光标左移,删除上个字符 • ‘\\’ 反斜杠:表示这个是真的 \ ,不是转义符 • ‘\”’ 双引号:在字符串常量中使用,防止歧义 • ‘\’’ 单引号:在字符常量中使用,防止歧义 • ‘\0’ 空字符:标记字符串结尾,等价于 0 • 换行符:另起一行(光标移到下一行行首) • ‘\r’ 回车符:光标移到行首(覆盖原来的字符) • ‘\t’ 缩进符:光标横坐标对齐到 8 的整数倍 • ‘\b’ 退格符:光标左移,删除上个字符 • ‘\\’ 反斜杠:表示这个是真的 \ ,不是转义符 • ‘\”’ 双引号:在字符串常量中使用,防止歧义 • ‘\’’ 单引号:在字符常量中使用,防止歧义 • ‘\0’ 空字符:标记字符串结尾,等价于 0 •0 码力 | 162 页 | 40.20 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 C++ 版如果把具體的工作技能比作是武功的“招式”的話,那麼基礎科目應該更像是“內功”。 我認為學演算法(以及其他基礎科目)的意義不是在於在工作中從零實現它,而是基於學到的知識,在解決 問題時能夠作出專業的反應和判斷,從而提升工作的整體質量。舉一個簡單例子,每種程式語言都內建了排 序函式: ‧ 如果我們沒有學過資料結構與演算法,那麼給定任何資料,我們可能都塞給這個排序函式去做了。執行 順暢、效能不錯,看上去並沒有什麼問題。 可接受的,通常需要使用動態規劃或貪婪演算法等來解決。 5. 對數階 ?(log ?) 與指數階相反,對數階反映了“每輪縮減到一半”的情況。設輸入資料大小為 ? ,由於每輪縮減到一半,因 此迴圈次數是 log2 ? ,即 2? 的反函式。 圖 2‑12 和以下程式碼模擬了“每輪縮減到一半”的過程,時間複雜度為 ?(log2 ?) ,簡記為 ?(log ?) : // === File: time_complexity.cpp hello‑algo.com 56 3.3.1 原碼、一補數和二補數 在上一節的表格中我們發現,所有整數型別能夠表示的負數都比正數多一個,例如 byte 的取值範圍是 [−128, 127] 。這個現象比較反直覺,它的內在原因涉及原碼、一補數、二補數的相關知識。 首先需要指出,數字是以“二補數”的形式儲存在計算機中的。在分析這樣做的原因之前,首先給出三者的 定義。 ‧ 原碼:我們將數字的二進位制表示的最高位視為符號位,其中0 码力 | 379 页 | 18.79 MB | 10 月前3
Hello 算法 1.1.0 C++ 版hello‑algo.com 56 3.3.1 原码、反码和补码 在上一节的表格中我们发现,所有整数类型能够表示的负数都比正数多一个,例如 byte 的取值范围是 [−128, 127] 。这个现象比较反直觉,它的内在原因涉及原码、反码、补码的相关知识。 首先需要指出,数字是以“补码”的形式存储在计算机中的。在分析这样做的原因之前,首先给出三者的定 义。 ‧ 原码:我们将数字的二进制表示的最高位视为符号位,其中 这里,建议有兴趣的读者进一步深入了解。 3.3.2 浮点数编码 细心的你可能会发现:int 和 float 长度相同,都是 4 字节,但为什么 float 的取值范围远大于 int ?这非 常反直觉,因为按理说 float 需要表示小数,取值范围应该变小才对。 实际上,这是因为浮点数 float 采用了不同的表示方式。记一个 32 比特长度的二进制数为: ?31?30?29 … ?2?1 所示的公式计算得到该元素的内存地址,从而直接 访问该元素。 第 4 章 数组与链表 hello‑algo.com 68 图 4‑2 数组元素的内存地址计算 观察图 4‑2 ,我们发现数组首个元素的索引为 0 ,这似乎有些反直觉,因为从 1 开始计数会更自然。但从地 址计算公式的角度看,索引本质上是内存地址的偏移量。首个元素的地址偏移量是 0 ,因此它的索引为 0 是 合理的。 在数组中访问元素非常高效,我们可以在0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版hello‑algo.com 56 3.3.1 原码、反码和补码 在上一节的表格中我们发现,所有整数类型能够表示的负数都比正数多一个,例如 byte 的取值范围是 [−128, 127] 。这个现象比较反直觉,它的内在原因涉及原码、反码、补码的相关知识。 首先需要指出,数字是以“补码”的形式存储在计算机中的。在分析这样做的原因之前,首先给出三者的定 义。 ‧ 原码:我们将数字的二进制表示的最高位视为符号位,其中 这里,建议有兴趣的读者进一步深入了解。 3.3.2 浮点数编码 细心的你可能会发现:int 和 float 长度相同,都是 4 字节,但为什么 float 的取值范围远大于 int ?这非 常反直觉,因为按理说 float 需要表示小数,取值范围应该变小才对。 实际上,这是因为浮点数 float 采用了不同的表示方式。记一个 32 比特长度的二进制数为: ?31?30?29 … ?2?1 所示的公式计算得到该元素的内存地址,从而直接 访问该元素。 第 4 章 数组与链表 www.hello‑algo.com 68 图 4‑2 数组元素的内存地址计算 观察图 4‑2 ,我们发现数组首个元素的索引为 0 ,这似乎有些反直觉,因为从 1 开始计数会更自然。但从地 址计算公式的角度看,索引本质上是内存地址的偏移量。首个元素的地址偏移量是 0 ,因此它的索引为 0 是 合理的。 在数组中访问元素非常高效,我们可以在0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0 C++版hello‑algo.com 56 3.3.1 原码、反码和补码 在上一节的表格中我们发现,所有整数类型能够表示的负数都比正数多一个,例如 byte 的取值范围是 [−128, 127] 。这个现象比较反直觉,它的内在原因涉及原码、反码、补码的相关知识。 首先需要指出,数字是以“补码”的形式存储在计算机中的。在分析这样做的原因之前,首先给出三者的定 义。 ‧ 原码:我们将数字的二进制表示的最高位视为符号位,其中 这里,建议有兴趣的读者进一步深入了解。 3.3.2 浮点数编码 细心的你可能会发现:int 和 float 长度相同,都是 4 字节,但为什么 float 的取值范围远大于 int ?这非 常反直觉,因为按理说 float 需要表示小数,取值范围应该变小才对。 实际上,这是因为浮点数 float 采用了不同的表示方式。记一个 32 比特长度的二进制数为: ?31?30?29 … ?2?1 所示的公式计算得到该元素的内存地址,从而直接 访问该元素。 第 4 章 数组与链表 hello‑algo.com 68 图 4‑2 数组元素的内存地址计算 观察图 4‑2 ,我们发现数组首个元素的索引为 0 ,这似乎有些反直觉,因为从 1 开始计数会更自然。但从地 址计算公式的角度看,索引本质上是内存地址的偏移量。首个元素的地址偏移量是 0 ,因此它的索引为 0 是 合理的。 在数组中访问元素非常高效,我们可以在0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.0.0b4 C++版等学完必读章节后再单独攻克。 3.3.1. 原码、反码和补码 从上一节的表格中我们发现,所有整数类型能够表示的负数都比正数多一个。例如,byte 的取值范围是 [−128, 127] 。这个现象比较反直觉,它的内在原因涉及到原码、反码、补码的相关知识。在展开分析之前, 我们首先给出三者的定义: ‧ 原码:我们将数字的二进制表示的最高位视为符号位,其中 0 表示正数,1 表示负数,其余位表示数字 议有兴趣的读者进一步深度了解。 3.3.2. 浮点数编码 细心的你可能会发现:int 和 float 长度相同,都是 4 bytes,但为什么 float 的取值范围远大于 int ?这非 常反直觉,因为按理说 float 需要表示小数,取值范围应该变小才对。 实际上,这是因为浮点数 float 采用了不同的表示方式。根据 IEEE 754 标准,32‑bit 长度的 float 由以下 firtstElementAddr + elementLength * elementIndex � 为什么数组元素的索引要从 0 开始编号呢? 观察上图,我们发现数组首个元素的索引为 0 ,这似乎有些反直觉,因为从 1 开始计数会更 自然。 然而,从地址计算公式的角度看,索引本质上表示的是内存地址的偏移量。首个元素的地址偏 移量是 0 ,因此索引为 0 也是合理的。 访问元素的高效性带来了诸多便利。例如,我们可以在0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.0.0b5 C++版hello‑algo.com 54 3.3.1 原码、反码和补码 在上一节的表格中我们发现,所有整数类型能够表示的负数都比正数多一个,例如 byte 的取值范围是 [−128, 127] 。这个现象比较反直觉,它的内在原因涉及到原码、反码、补码的相关知识。 首先需要指出,数字是以“补码”的形式存储在计算机中的。在分析这样做的原因之前,我们首先给出三者 的定义。 ‧ 原码:我们将数字的二进制表示的最高位视为符号位,其中 建议有兴趣的读者进一步深度了解。 3.3.2 浮点数编码 细心的你可能会发现:int 和 float 长度相同,都是 4 bytes,但为什么 float 的取值范围远大于 int ?这非 常反直觉,因为按理说 float 需要表示小数,取值范围应该变小才对。 实际上,这是因为浮点数 float 采用了不同的表示方式。记一个 32‑bit 长度的二进制数为: ?31?30?29 … ?2 所示的公式计算得到该元素的内存地址,从而直 接访问此元素。 第 4 章 数组与链表 hello‑algo.com 65 图 4‑2 数组元素的内存地址计算 观察图 4‑2 ,我们发现数组首个元素的索引为 0 ,这似乎有些反直觉,因为从 1 开始计数会更自然。但从地 址计算公式的角度看,索引的含义本质上是内存地址的偏移量。首个元素的地址偏移量是 0 ,因此它的索引 为 0 也是合理的。 在数组中访问元素是非常高效的,我们可以在0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.0.0b2 C++版矩阵、张量(维度 ≥ 3 的数组)等; ‧ 基于链表可实现:栈、队列、哈希表、树、堆、图等; 基于数组实现的数据结构也被称为「静态数据结构」,这意味着该数据结构在在被初始化后,长度不可变。相 反地,基于链表实现的数据结构被称为「动态数据结构」,该数据结构在被初始化后,我们也可以在程序运行 中修改其长度。 � 数组与链表是其他所有数据结构的“底层积木”,建议读者一定要多花些时间了解。 3 当然,由于结点需要额外存储指针,因此 链表结点比数组元素占用更大。 综上,我们不能简单地确定哪种实现更加省内存,需要 case‑by‑case 地分析。 5.1.4. 栈典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就将上一个网页执行 入栈,这样我们就可以通过「后退」操作来回到上一页面,后退操作实际上是在执行出栈。如果要同时 支持后退和前进,那么则需要两个栈来配合实现。 ‧ pivot - 1] } } } � 哨兵划分中“从右往左查找”与“从左往右查找”的顺序可以交换吗? 不行,当我们以最左端元素为基准数时,必须先“从右往左查找”再“从左往右查找”。这个结 论有些反直觉,我们来剖析一下原因。 哨兵划分 partition() 的最后一步是交换 nums[left] 和 nums[i] ,完成交换后,基准数左边的 元素都 <= 基准数,这就要求最后一步交换前 nums[left]0 码力 | 197 页 | 15.72 MB | 1 年前3
《深入浅出MFC》2/e我只涉獵 MFC(OWL 和 Java 是我的㆘㆒個獵物)。 Windows 作業系統 � Windows Internals / Matt Pietrek / Addison Wesley 最能夠反應作業系統奧秘的,就是作業系統內部資料結構以及 API 的內部動作了。本書 藉著對這兩部份所做的逆向工程,剖析 Windows 的核心。 ㆒個設計良好的應用程式介面(API)應該是㆒個不必讓程式員擔心的黑盒子。本書的主 DefWindowProc 和 DefDlgProc 的原始碼),以及 DDK 磁片㆗的㆒ 大堆驅動程式原始碼。那麼作者如何獲得比你我更多的秘密呢? Matt Pietrek 是軟體反組譯逆向工程的個㆗翹楚。本書藉由㆒個他自己開發的反組譯工 具,把獲得的結果再以 C 虛擬碼表現出來。我們在書㆗看到許許多多的 Windows API 虛擬碼都是這麼來的。Pietrek 還有㆒個很有名的產品叫做 BoundsChecker,和 856 無責任書評 MFC 四大天王 關於 MFC 這㆒主題,在「滄海書訊」版㆖曾經被討論過的書籍有㆕本,正是我所列出的 這㆕大㆝王。看來我心目㆗的好書頗能吻合市場的反應。 侯捷 / 1997.02 發表於 Run!PC 雜誌 我還記得,無責任書評是在㆕年前(1993)開春時和大家第㆒次見面。雖然不是每個月 都出貨,但斷斷續續總保持著訊息。在明確宣佈的情況㆘這個專欄曾經停過兩次,第㆒0 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅解决了指令缓存失效问题,但是三次独立的 for 循环每次 结束都需要同步,一定程度上妨碍了 CPU 发挥性能;而 且每个 step 后依然写回了数组,数据缓存没法充分利用 。 另辟蹊径:流水线并行 加速比: 6.73 倍 反直觉的并行方式,但是加速效果却很理想,为什么? 流水线模式下每个线程都只做自己的那个步骤( filter ),从 而对指令缓存更友好。且一个核心处理完的数据很快会被另一 个核心用上,对三级缓存比较友好,也节省内存。0 码力 | 116 页 | 15.85 MB | 1 年前3
共 12 条
- 1
- 2













