 C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型从稀疏数据结构到量化数据类型 by 彭于斌( @archibate ) 往期录播: https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 本课涵盖:稀疏矩阵、 unordered_map 、空间稀 疏网格、位运算、浮点的二进制格式、内存带宽优 化 面向人群:图形学、 >> 3 。 >> 2 = 位运算 >> 对负数的处理 signed 类型的 >> n 会把最高位复制 n 次。 因为补码的特性,这导致负数 >> 的结果仍是负 数。 这样就实现了和 Python 一样的始终向下取整除 法。 >> 2 = unsigned 类型的位运算 >> 不一样 而 unsigned 类型的 >> n 会不会复制最高位, 只是单纯的位移,这会导致负数的符号位单独被位 只是单纯的位移,这会导致负数的符号位单独被位 移,补码失效,造成结果不对。 unsigned 类型的 >> 会生成 shr 指令, signed 类型的 >> 会生成 sar 指令。 我们需要负方向无限延伸的稀疏数据结果,那就只 要 signed 那个就行。 >> 2 = 没有重合时可以用高效的加法:位运算 | • 如果可以保证 a 和 b 满足 a & b = 0 , 如: • 1011000 和 00001100 码力 | 102 页 | 9.50 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型从稀疏数据结构到量化数据类型 by 彭于斌( @archibate ) 往期录播: https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 本课涵盖:稀疏矩阵、 unordered_map 、空间稀 疏网格、位运算、浮点的二进制格式、内存带宽优 化 面向人群:图形学、 >> 3 。 >> 2 = 位运算 >> 对负数的处理 signed 类型的 >> n 会把最高位复制 n 次。 因为补码的特性,这导致负数 >> 的结果仍是负 数。 这样就实现了和 Python 一样的始终向下取整除 法。 >> 2 = unsigned 类型的位运算 >> 不一样 而 unsigned 类型的 >> n 会不会复制最高位, 只是单纯的位移,这会导致负数的符号位单独被位 只是单纯的位移,这会导致负数的符号位单独被位 移,补码失效,造成结果不对。 unsigned 类型的 >> 会生成 shr 指令, signed 类型的 >> 会生成 sar 指令。 我们需要负方向无限延伸的稀疏数据结果,那就只 要 signed 那个就行。 >> 2 = 没有重合时可以用高效的加法:位运算 | • 如果可以保证 a 和 b 满足 a & b = 0 , 如: • 1011000 和 00001100 码力 | 102 页 | 9.50 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 性能优化之无分支编程 Branchless Programming,直到第二次又被打脸,下调到最初 的起点 50%…… 从汇编看 if-else jle .L2 :如果上一次 cmp 的结果为小于等于,则跳转到 .L2 jmp .L3 :无条件跳转到 .L3 归纳得出 if-else 转换成汇编后的固定格式 • if ( 条件 > 0) { // 大于才执行 A ,否则 B • 分支 A; • } else { • 分支 B; • } 0 更高效的写法 setle al :如果上一次 cmp 的结果为小于等于,则把 al 设为 1 ,否则设为 0 add eax, 1 :给 eax 加 1 ,也就是 eax=eax+1 的意思 归纳得出编译器对 if-else 的优化策略 • if ( 条件 > 0) { // jle • return 1; • } else { // jmp • return 这里 x > 0 返回的是一个 bool 类型(通过指令 setg al 求出) • bool 类型和 char 一样只占据 1 字节( al 寄存器就 1 字节) • 而 C 语言可以自动把 bool 转换成 int 类型( movzx 把 1 字节的 al 转换成 4 字节的 eax ,零扩展:高 3 字节 填充零) • 返回类型 int 占据 4 字节( eax 寄存器就是0 码力 | 47 页 | 8.45 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 性能优化之无分支编程 Branchless Programming,直到第二次又被打脸,下调到最初 的起点 50%…… 从汇编看 if-else jle .L2 :如果上一次 cmp 的结果为小于等于,则跳转到 .L2 jmp .L3 :无条件跳转到 .L3 归纳得出 if-else 转换成汇编后的固定格式 • if ( 条件 > 0) { // 大于才执行 A ,否则 B • 分支 A; • } else { • 分支 B; • } 0 更高效的写法 setle al :如果上一次 cmp 的结果为小于等于,则把 al 设为 1 ,否则设为 0 add eax, 1 :给 eax 加 1 ,也就是 eax=eax+1 的意思 归纳得出编译器对 if-else 的优化策略 • if ( 条件 > 0) { // jle • return 1; • } else { // jmp • return 这里 x > 0 返回的是一个 bool 类型(通过指令 setg al 求出) • bool 类型和 char 一样只占据 1 字节( al 寄存器就 1 字节) • 而 C 语言可以自动把 bool 转换成 int 类型( movzx 把 1 字节的 al 转换成 4 字节的 eax ,零扩展:高 3 字节 填充零) • 返回类型 int 占据 4 字节( eax 寄存器就是0 码力 | 47 页 | 8.45 MB | 1 年前3
 Hello 算法 1.0.0b4 C++版3.1. 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.2. 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.3. 数字编码 * . . . . 本书主要内容包括: ‧ 复杂度分析:数据结构和算法的评价维度,算法效率的评估方法。时间复杂度、空间复杂度的推算方 法、常见类型、示例等。 ‧ 数据结构:基本数据类型,数据结构的分类方法。数组、链表、栈、队列、散列表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤、 标注,以避免歧义。 ‧ 涉及到编程语言之间不一致的名词,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2. 在动画图解中高效学习0 码力 | 343 页 | 27.39 MB | 1 年前3 Hello 算法 1.0.0b4 C++版3.1. 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.2. 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.3. 数字编码 * . . . . 本书主要内容包括: ‧ 复杂度分析:数据结构和算法的评价维度,算法效率的评估方法。时间复杂度、空间复杂度的推算方 法、常见类型、示例等。 ‧ 数据结构:基本数据类型,数据结构的分类方法。数组、链表、栈、队列、散列表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤、 标注,以避免歧义。 ‧ 涉及到编程语言之间不一致的名词,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2. 在动画图解中高效学习0 码力 | 343 页 | 27.39 MB | 1 年前3
 Hello 算法 1.1.0 C++ 版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3 数字编码 * . . . . 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 免歧义。 ‧ 当涉及编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 第 0 章 前言 hello‑algo.com 5 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行0 码力 | 379 页 | 18.47 MB | 1 年前3 Hello 算法 1.1.0 C++ 版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3 数字编码 * . . . . 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 免歧义。 ‧ 当涉及编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 第 0 章 前言 hello‑algo.com 5 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行0 码力 | 379 页 | 18.47 MB | 1 年前3
 Hello 算法 1.0.0 C++版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3 数字编码 * . . . . 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 加粗,这类文字值得特别关注。 ‧ 当涉及编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 第 0 章 前言 hello‑algo.com 50 码力 | 378 页 | 17.59 MB | 1 年前3 Hello 算法 1.0.0 C++版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3 数字编码 * . . . . 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 加粗,这类文字值得特别关注。 ‧ 当涉及编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 第 0 章 前言 hello‑algo.com 50 码力 | 378 页 | 17.59 MB | 1 年前3
 Hello 算法 1.0.0b5 C++版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.3 数字编码 * . . . . 本书主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度、空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型,数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤、 关注。 ‧ 当涉及到编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习0 码力 | 377 页 | 30.69 MB | 1 年前3 Hello 算法 1.0.0b5 C++版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.3 数字编码 * . . . . 本书主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度、空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型,数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤、 关注。 ‧ 当涉及到编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习0 码力 | 377 页 | 30.69 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 C++ 版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3 数字编码 * . . . . 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 免歧义。 ‧ 当涉及编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 第 0 章 前言 www.hello‑algo.com 5 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** *0 码力 | 379 页 | 18.48 MB | 10 月前3 Hello 算法 1.2.0 简体中文 C++ 版3.1 数据结构分类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.2 基本数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3 数字编码 * . . . . 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 免歧义。 ‧ 当涉及编程语言之间不一致的名词时,本书均以 Python 为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 第 0 章 前言 www.hello‑algo.com 5 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** *0 码力 | 379 页 | 18.48 MB | 10 月前3
 《深入浅出MFC》2/e章):这个程序示范如何在同一份Document 的各个「同 源view 窗口」中,以不同的显示方法表现同一份资料,做到一体数面。 Graph2 范例程序(第13 章):这个程序示范如何为程序加上第二个Document 类型。其间关系到新的Document,新的View,新的UI。 MltiThrd 范例程序(第14 章):这是第1章的同名程序的MFC 版。我只示 范MFC 多线程程序的架构,原Mltithrd template)。这是在RC 文件中定义的一个对话框外貌,以各 种方式决定对话框的大小、字形、内部有哪些控制组件、各在什么位置...等等。 2. 对话框函数(dialog procedure)。其类型非常类似窗口函数,但是它通常只处 理WM_INITDIALOG 和WM_COMMAND 两个消息。对话框中的各个控制组件也 都是小小窗口,各有自己的窗口函数,它们以消息与其管理者(父窗口,也就 aSales.computePay(); // 这是销售员的全薪 结论是:要调用父类别的函数,你必须使用scope resolution operator(::)明白指出。 接下来我要触及对象类型的转换,这关系到指针的运用,更直接关系到为什么需要虚拟 函数。了解它,对于application framework 如MFC 者的运用十分十分重要。 假设我们有两个对象: CWage aWager;0 码力 | 1009 页 | 11.08 MB | 1 年前3 《深入浅出MFC》2/e章):这个程序示范如何在同一份Document 的各个「同 源view 窗口」中,以不同的显示方法表现同一份资料,做到一体数面。 Graph2 范例程序(第13 章):这个程序示范如何为程序加上第二个Document 类型。其间关系到新的Document,新的View,新的UI。 MltiThrd 范例程序(第14 章):这是第1章的同名程序的MFC 版。我只示 范MFC 多线程程序的架构,原Mltithrd template)。这是在RC 文件中定义的一个对话框外貌,以各 种方式决定对话框的大小、字形、内部有哪些控制组件、各在什么位置...等等。 2. 对话框函数(dialog procedure)。其类型非常类似窗口函数,但是它通常只处 理WM_INITDIALOG 和WM_COMMAND 两个消息。对话框中的各个控制组件也 都是小小窗口,各有自己的窗口函数,它们以消息与其管理者(父窗口,也就 aSales.computePay(); // 这是销售员的全薪 结论是:要调用父类别的函数,你必须使用scope resolution operator(::)明白指出。 接下来我要触及对象类型的转换,这关系到指针的运用,更直接关系到为什么需要虚拟 函数。了解它,对于application framework 如MFC 者的运用十分十分重要。 假设我们有两个对象: CWage aWager;0 码力 | 1009 页 | 11.08 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针• 11111100 表示 252 11111101 表示 253 11111110 表示 254 11111111 表示 255 • 字节实际上就是 C 语言中的 unsigned char 类型。 表示更大范围的整数:字( word ) • 但是单单一个字节表示的范围还是太有限了,只能表示 0 到 255 的值。 • 如何扩大表示范围?简单,用两个字节合在一起即可,例如: • 00000000-00000000 11111111-11111110 表示 65534 11111111-11111111 表示 65535 • 这就是两个字节合成了一个字( word ),实际上就是 C 语言里的 unsigned short 类型 。 不同位数的计算机,字( word )的大小也不一样 • 刚刚说把 2 个字节( byte )拼成一个字( word ),实际上是 16 位计算机的做法。 • 16 位计算机得名就是因为他的字由 位计算机反而是因为 16777216 TB 太大,内存地址被阉割到了 39 位( 512GB )。 • 64 位计算机:小丑竟是我自己 lscpu 命令查看处理器相关信息 C 语言中的整数类型 C 语言的基础整数类型 类型 Unix 32 位 Unix 64 位 Windows 32 位 Windows 64 位 char 8 位 8 位 8 位 8 位 short 16 位 16 位 16 位 160 码力 | 128 页 | 2.95 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针• 11111100 表示 252 11111101 表示 253 11111110 表示 254 11111111 表示 255 • 字节实际上就是 C 语言中的 unsigned char 类型。 表示更大范围的整数:字( word ) • 但是单单一个字节表示的范围还是太有限了,只能表示 0 到 255 的值。 • 如何扩大表示范围?简单,用两个字节合在一起即可,例如: • 00000000-00000000 11111111-11111110 表示 65534 11111111-11111111 表示 65535 • 这就是两个字节合成了一个字( word ),实际上就是 C 语言里的 unsigned short 类型 。 不同位数的计算机,字( word )的大小也不一样 • 刚刚说把 2 个字节( byte )拼成一个字( word ),实际上是 16 位计算机的做法。 • 16 位计算机得名就是因为他的字由 位计算机反而是因为 16777216 TB 太大,内存地址被阉割到了 39 位( 512GB )。 • 64 位计算机:小丑竟是我自己 lscpu 命令查看处理器相关信息 C 语言中的整数类型 C 语言的基础整数类型 类型 Unix 32 位 Unix 64 位 Windows 32 位 Windows 64 位 char 8 位 8 位 8 位 8 位 short 16 位 16 位 16 位 160 码力 | 128 页 | 2.95 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程multiply(Numeric *) 的话 依然会违背你们的开 - 闭原则:比如 3.14f * 3 ,两 端是不同的类型,怎么处理所有可能类型的排列组合 ? 不如放弃类和方法的概念,欣然接受全局函数和重载 。 模板函数:定义 • 使用 template C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程multiply(Numeric *) 的话 依然会违背你们的开 - 闭原则:比如 3.14f * 3 ,两 端是不同的类型,怎么处理所有可能类型的排列组合 ? 不如放弃类和方法的概念,欣然接受全局函数和重载 。 模板函数:定义 • 使用 template- • 其中 T 可以变成任意类型。 • 调用时 twice - 即可将 T 替换为 int 。 • 注意有的教材上写做: • template - • 是完全等价的,只是个人喜好不同。 模板函数:自动推导参数类型 • 那这样需要手动写 - , - 用起 来还不如重载方便了? • 别担心, C++ 规定: • 当模板类型参数 T 作为函数参数时,则可 以省略该模板参数。自动根据调用者的参 数判断。 模板函数:特化的重载 • 有时候,一个统一的实现(比如 t 模板函数:默认参数类型 • 但是如果模板类型参数 T 没有出现在函数 的参数中,那么编译器就无法推断,就不 得不手动指定了。 • 但是,可以通过 • template - • 表示调用者没有指定时, T 默认为 int 。 模板参数:整数也可以作为参数 • template - • 可以声明类型 T 作为模板尖括号里的参数。除了 类型,任意整数也可以作为模板参数: 0 码力 | 82 页 | 12.15 MB | 1 年前3
共 27 条
- 1
- 2
- 3













