C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针每个存储 0 或 1 的空间称为一个位( bit ),一位可以存储 0 或 1 两个可能的值。 • 现在的计算机都会把 8 个位打包成一个字节( byte ),也就是说: 1 字节 = 8 位。 • 一字节可以表示 0 到 255 区间中所有的值,表示方式如下: • 00000000 表示 0 00000001 表示 1 00000010 表示 2 00000011 表示 3 • 00000100 252 11111101 表示 253 11111110 表示 254 11111111 表示 255 • 字节实际上就是 C 语言中的 unsigned char 类型。 表示更大范围的整数:字( word ) • 但是单单一个字节表示的范围还是太有限了,只能表示 0 到 255 的值。 • 如何扩大表示范围?简单,用两个字节合在一起即可,例如: • 00000000-00000000 11111111-11111111 表示 65535 • 这就是两个字节合成了一个字( word ),实际上就是 C 语言里的 unsigned short 类型 。 不同位数的计算机,字( word )的大小也不一样 • 刚刚说把 2 个字节( byte )拼成一个字( word ),实际上是 16 位计算机的做法。 • 16 位计算机得名就是因为他的字由 16 个位组成,早期的 8086 系列 CPU 就是 160 码力 | 128 页 | 2.95 MB | 1 年前3
现代C++ 教程:高速上手C++11/14/17/20C++ (本书中均指 C++11/14/17/20) 为传统 C++ 注入的大量特性使得整个 C++ 变得更加 像一门现代化的语言。现代 C++ 不仅仅增强了 C++ 语言自身的可用性,auto 关键字语义的修改使得我 们更加有信心来操控极度复杂的模板类型。同时还对语言运行期进行了大量的强化,Lambda 表达式的出 现让 C++ 具有了『匿名函数』的『闭包』特性,而这一特性几乎在现代的编程语言(诸如 到问题时,不 妨读一读随书附上的源码,你可以在这里中找到书中介绍过的全部的源码,所有代码按章节组织,文件 夹名称为章节序号。 随书习题 本书每章最后还加入了少量难度极小的习题,仅用于检验你是否能混合运用当前章节中的知识点。你 可以在这里找到习题的答案,文件夹名称为章节序号。 第 1 章迈向现代 C++ 编译环境:本书将使用 clang++ 作为唯一使用的编译器,同时总是在代码中使用 -std=c++2a 异常说明、unexpected_handler、set_unexpected() 等相关特性被弃用,应该使用 noexcept。 • auto_ptr 被弃用,应使用 unique_ptr。 • register 关键字被弃用,可以使用但不再具备任何实际含义。 • bool 类型的 ++ 操作被弃用。 • 如果一个类有析构函数,为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了。 • C 语言风格的类型转换被弃用(即在变量前使用0 码力 | 83 页 | 2.42 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串结尾字符串”知识点应用举例 • 利用 C 语言字符串“以 0 结尾”这个特点,我们可以在一个 本来非 0 的字符处写入 0 ,来提前结束字符串。例如在第 n 个字符写入 0 ,就会只保留前 n 个字符作为一个子字 符串,删除后半部分。 “0 结尾字符串”知识点应用举例 • C 语言所谓的字符串类型 char * 实际上就是个首地址指 针,如果让首地址指针向前移动 n 位,那就实现删除前 n 个字符的效果,而不用实际修改数组本身(更高效)。 utils/format.h cout 支持十六进制 官方推荐用 stringstream 取代 to_string • cout 这么方便,能不能让他不要直接输出到控制台,而是把结果存到一个字 符串呢?这正是字符串流 stringstream 的作用。 • 和 cout 完全一样,同样的 << 和 hex 选项。 • 但是他的输出会保存到一个字符串里。 • 调用成员函数 .str() 就能取出这个字符串了。 超出了原字符串的范围,则抛出 std::out_of_range 异常(和 at 同款的哦)。 • 可以指定 len 为 -1 (即 string::npos ),此时会截取从 pos 开始直到原字符串末尾的子字 符串。 • 不指定第二参数 len 时,默认的 len 就是 -1 (见下方第三个例子)。 • 例如: • “hello”.substr(1, 3) = “ell” • “hello”.substr(10 码力 | 162 页 | 40.20 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 C++ 版52 3.2 基本資料型別 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3 數字編碼 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 3.4 字元編碼 * . 得分享:你已經在不知不覺中學會了許多演算法,並習慣將它 們應用到日常生活中了。下面我將舉幾個具體的例子來證實這一點。 例一:查字典。在字典裡,每個漢字都對應一個拼音,而字典是按照拼音字母順序排列的。假設我們需要查 詢一個拼音首字母為 ? 的字,通常會按照圖 1‑1 所示的方式實現。 1. 翻開字典約一半的頁數,檢視該頁的首字母是什麼,假設首字母為 ? 。 2. 由於在拼音字母表中 ? 位於 ,求該數列的第 ? 個數字。 設費波那契數列的第 ? 個數字為 ?(?) ,易得兩個結論。 ‧ 數列的前兩個數字為 ?(1) = 0 和 ?(2) = 1 。 ‧ 數列中的每個數字是前兩個數字的和,即 ?(?) = ?(? − 1) + ?(? − 2) 。 按照遞推關係進行遞迴呼叫,將前兩個數字作為終止條件,便可寫出遞迴程式碼。呼叫 fib(n) 即可得到費波 那契數列的第 ? 個數字: // ===0 码力 | 379 页 | 18.79 MB | 10 月前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化局部可见函数: static 因为 static 声明表示不会暴露 other 给其 他文件,而且 func 也已经内联了 other , 所以编译器干脆不定义 other 了。 inline 关键字?不需要! 编译的结果完全一致? 结论:在现代编译器的高强度优化下,加不加 inline 无所谓 编译器不是傻子,只要他看得见 other 的函数体定义,就会自动内联 内联与否和 inline 没关 如果你不确定某修改是否能提升性能,那你最好实际测一下,不要脑内模拟 inline 在现代 C++ 中有其他含义,但和内联没有关系,他是一个迷惑性的名字 “ 大厂面试官”笑话 • 同样沦为笑柄的还有 register 关键字,号称:可以让一个变量使用寄存器存储,更高效。 • 都能把等差数列求和优化成 5050 的编译器笑着看着你,说道:还要你提醒吗? • 所以,如果某“面试官”试图“考考”你 register 和 inline 没有改变。 导致优化后结果不一样,这就是 编译器放弃优化的原因。 告诉编译器别怕指针别名: __restrict 关键字 __restrict 是一个提示性的关键字,是程序员向 编译器保证:这些指针之间不会发生重叠! 从而他可以放心地优化成功: __restrict 关键字:只需加在非 const 的即可 实际上, __restrict 只需要加在所有具有写入 访问的指针(这里是 c )上,就可以优化成功0 码力 | 108 页 | 9.47 MB | 1 年前3
Hello 算法 1.1.0 C++ 版惯将它们应 用到日常生活中了。下面我将举几个具体的例子来证实这一点。 例一:查字典。在字典里,每个汉字都对应一个拼音,而字典是按照拼音字母顺序排列的。假设我们需要查 找一个拼音首字母为 ? 的字,通常会按照图 1‑1 所示的方式实现。 1. 翻开字典约一半的页数,查看该页的首字母是什么,假设首字母为 ? 。 2. 由于在拼音字母表中 ? 位于 ? 之后,所以排除字典前半部分,查找范围缩小到后半部分。 数据模型,其用于 包括 Linux 和 macOS 在内的 Unix 64 位操作系统。 ‧ 字符 char 的大小在 C 和 C++ 中为 1 字节,在大多数编程语言中取决于特定的字符编码方法,详见“字 符编码”章节。 ‧ 即使表示布尔量仅需 1 位(0 或 1),它在内存中通常也存储为 1 字节。这是因为现代计算机 CPU 通常 将 1 字节作为最小寻址内存单元。 那么,基本数据类型与数据结 光日常使用的就 有几千个。中国国家标准总局于 1980 年发布了 GB2312 字符集,其收录了 6763 个汉字,基本满足了汉字的 计算机处理需要。 然而,GB2312 无法处理部分罕见字和繁体字。GBK 字符集是在 GB2312 的基础上扩展得到的,它共收录了 21886 个汉字。在 GBK 的编码方案中,ASCII 字符使用一个字节表示,汉字使用两个字节表示。 第 3 章 数据结构0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0 C++版惯将它们应 用到日常生活中了。下面我将举几个具体的例子来证实这一点。 例一:查字典。在字典里,每个汉字都对应一个拼音,而字典是按照拼音字母顺序排列的。假设我们需要查 找一个拼音首字母为 ? 的字,通常会按照图 1‑1 所示的方式实现。 1. 翻开字典约一半的页数,查看该页的首字母是什么,假设首字母为 ? 。 2. 由于在拼音字母表中 ? 位于 ? 之后,所以排除字典前半部分,查找范围缩小到后半部分。 数据模型,其用于 包括 Linux 和 macOS 在内的 Unix 64 位操作系统。 ‧ 字符 char 的大小在 C 和 C++ 中为 1 字节,在大多数编程语言中取决于特定的字符编码方法,详见“字 符编码”章节。 ‧ 即使表示布尔量仅需 1 位(0 或 1),它在内存中通常也存储为 1 字节。这是因为现代计算机 CPU 通常 将 1 字节作为最小寻址内存单元。 那么,基本数据类型与数据结 码仍然无法满足许多语言的字符数量要求。比如汉字有近十万个,光日常使用的就 有几千个。中国国家标准总局于 1980 年发布了「GB2312」字符集,其收录了 6763 个汉字,基本满足了汉 字的计算机处理需要。 然而,GB2312 无法处理部分罕见字和繁体字。「GBK」字符集是在 GB2312 的基础上扩展得到的,它共收录 了 21886 个汉字。在 GBK 的编码方案中,ASCII 字符使用一个字节表示,汉字使用两个字节表示。0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版惯将它们应 用到日常生活中了。下面我将举几个具体的例子来证实这一点。 例一:查字典。在字典里,每个汉字都对应一个拼音,而字典是按照拼音字母顺序排列的。假设我们需要查 找一个拼音首字母为 ? 的字,通常会按照图 1‑1 所示的方式实现。 1. 翻开字典约一半的页数,查看该页的首字母是什么,假设首字母为 ? 。 2. 由于在拼音字母表中 ? 位于 ? 之后,所以排除字典前半部分,查找范围缩小到后半部分。 数据模型,其用于 包括 Linux 和 macOS 在内的 Unix 64 位操作系统。 ‧ 字符 char 的大小在 C 和 C++ 中为 1 字节,在大多数编程语言中取决于特定的字符编码方法,详见“字 符编码”章节。 ‧ 即使表示布尔量仅需 1 位(0 或 1),它在内存中通常也存储为 1 字节。这是因为现代计算机 CPU 通常 将 1 字节作为最小寻址内存单元。 那么,基本数据类型与数据结 光日常使用的就 有几千个。中国国家标准总局于 1980 年发布了 GB2312 字符集,其收录了 6763 个汉字,基本满足了汉字的 计算机处理需要。 然而,GB2312 无法处理部分罕见字和繁体字。GBK 字符集是在 GB2312 的基础上扩展得到的,它共收录了 21886 个汉字。在 GBK 的编码方案中,ASCII 字符使用一个字节表示,汉字使用两个字节表示。 第 3 章 数据结构0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0b5 C++版将它们应 用到日常生活中了。下面,我将举几个具体例子来证实这一点。 例一:查阅字典。在字典里,每个汉字都对应一个拼音,而字典是按照拼音字母顺序排列的。假设我们需要 查找一个拼音首字母为 ? 的字,通常会按照图 1‑1 所示的方式实现。 1. 翻开字典约一半的页数,查看该页的首字母是什么,假设首字母为 ? 。 2. 由于在拼音字母表中 ? 位于 ? 之后,所以排除字典前半部分,查找范围缩小到后半部分。 数据模型,其用于包 括 Linux 和 macOS 在内的 Unix 64 位操作系统。 ‧ 字符 char 的大小在 C 和 C++ 中为 1 字节,在大多数编程语言中取决于特定的字符编码方法,详见“字 符编码”章节。 ‧ 即使表示布尔量仅需 1 位(0 或 1),它在内存中通常被存储为 1 字节。这是因为现代计算机 CPU 通常 将 1 字节作为最小寻址内存单元。 那么,基本数据类型与数据 (2 − 2−23) ≈ 3.4 × 1038 ,切换符号位便可得到最小负数。 尽管浮点数 float 扩展了取值范围,但其副作用是牺牲了精度。整数类型 int 将全部 32 位用于表示数字,数 字是均匀分布的;而由于指数位的存在,浮点数 float 的数值越大,相邻两个数字之间的差值就会趋向越 大。 如表 3‑2 所示,指数位 ? = 0 和 ? = 255 具有特殊含义,用于表示零、无穷大、NaN0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.0.0b4 C++版应 用到日常生活中了。下面,我将举几个具体例子来证实这一点。 例一:查阅字典。在字典里,每个汉字都对应一个拼音,而字典是按照拼音的英文字母顺序排列的。假设我 们需要查找一个拼音首字母为 ? 的字,通常会这样操作: 1. 翻开字典约一半的页数,查看该页首字母是什么,假设首字母为 ? 。 2. 由于在英文字母表中 ? 位于 ? 之后,所以排除字典前半部分,查找范围缩小到后半部分。 3. 不断重复步骤 (2 − 2−23) ≈ 3.4 × 1038 ,切换符号位便可得到最小负数。 尽管浮点数 float 扩展了取值范围,但其副作用是牺牲了精度。整数类型 int 将全部 32 位用于表示数字,数 字是均匀分布的;而由于指数位的存在,浮点数 float 的数值越大,相邻两个数字之间的差值就会趋向越 大。 进一步地,指数位 ? = 0 和 ? = 255 具有特殊含义,用于表示零、无穷大、NaN 光日常使 用的就有几千个。中国国家标准总局于 1980 年发布了「GB2312」字符集,其收录了 6763 个汉字,基本满 足了汉字的计算机处理需要。 然而,GB2312 无法处理部分的罕见字和繁体字。之后在 GB2312 的基础上,扩展得到了「GBK」字符集,它 共收录了 21886 个汉字。在 GBK 编码方案中,ASCII 字符使用一个字节表示,汉字使用两个字节表示。 3. 数据结构0 码力 | 343 页 | 27.39 MB | 1 年前3
共 24 条
- 1
- 2
- 3













