现代C++ 教程:高速上手C++11/14/17/20. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 5 目录 目录 事务内存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 并且,编译器产生的默认构造函数与用户定义的构造函数无法同时存在。若用户定义了任何构造函 数,编译器将不再生成默认构造函数,但有时候我们却希望同时拥有这两种构造函数,这就造成了尴尬。 C++11 提供了上述需求的解决方案,允许显式的声明采用或拒绝编译器自带的函数。例如: class Magic { public: 31 2.6 面向对象 第 2 章语言可用性的强化 Magic() = default; // 中正则表达式一直没 有得到语言层面的支持,没有纳入标准库,而 C++ 作为一门高性能语言,在后台服务的开发中,对 URL 资源链接进行判断时,使用正则表达式也是工业界最为成熟的普遍做法。 一般的解决方案就是使用 boost 的正则表达式库。而 C++11 正式将正则表达式的的处理方法纳入 标准库的行列,从语言级上提供了标准的支持,不再依赖第三方。 C++11 提供的正则表达式库操作 std::string0 码力 | 83 页 | 2.42 MB | 1 年前3
《深入浅出MFC》2/e却是为生活而技术,探讨深入,但 谨守主轴份际。所有我所铺陈的核心层面的知识,都是为了建立起一份扎扎实实的 programming 基础,让你彻底了解MFC 为你铺陈的骨干背后,隐藏了多少巧妙机关,做掉 了多少烦琐事务。 有了这份基础,你才有轻松驾驭MFC 的本钱。 唯有这份基础,才能使你胸中自有丘壑。 如果够用心,你还可以附带地从本书概略学习到一个application framework 的设计蓝图。虽 event,可以重新开发一套支持多执行线程的runtime 函数库。问题是,加上这样的能 力,可能导至程序代码大小和执行效率都遭受不良波及-- 即使你只激活了一个执行 线程。 Visual C++ 的折衷方案是提供两种版本的C runtime 函数库。一种版本给单线程程序 使用,一种版本给多线程程序使用。多线程版本的重大改变是,第一,变量如errno 者 现在变成每个执行线程各拥有一个。第二,多线程版中的数据结构以同步机制加以保护。 编译器本身支 持完整的C++ exceptions,MFC 也因此有了两个exception 版本:你可以使用语言本身 提供的性能,也可以沿用MFC 古老的方法(以宏形式出现)。人们曾经因为MFC 的 方案不同于ANSI 标准而非难它,但是不要忘记它已经运作了多少年。 MFC 的exceptions 机制是以宏和exception types 为基础。这些宏类似C++ 的 exception 保留字,动作也满像。MFC0 码力 | 1009 页 | 11.08 MB | 1 年前3
Hello 算法 1.0.0b4 C++版− 20 = 11 元。 3. 从剩余可选项中拿出最大的 10 元,剩余 11 − 10 = 1 元。 4. 从剩余可选项中拿出最大的 1 元,剩余 1 − 1 = 0 元。 5. 完成找零,方案为 20 + 10 + 1 = 31 元。 在以上步骤中,我们每一步都采取当前看来最好的选择(尽可能用大面额的货币),最终得到了可行的找零方 案。从数据结构与算法的角度看,这种方法本质上是「贪心算法」。 } return count; } Figure 2‑7. 线性对数阶的时间复杂度 阶乘阶 ?(?!) 阶乘阶对应数学上的「全排列」问题。给定 ? 个互不重复的元素,求其所有可能的排列方案,方案数量为: ?! = ? × (? − 1) × (? − 2) × ⋯ × 2 × 1 阶乘通常使用递归实现。例如以下代码,第一层分裂出 ? 个,第二层分裂出 ? − 1 个,以此类推,直至第 个汉字,基本满 足了汉字的计算机处理需要。 然而,GB2312 无法处理部分的罕见字和繁体字。之后在 GB2312 的基础上,扩展得到了「GBK」字符集,它 共收录了 21886 个汉字。在 GBK 编码方案中,ASCII 字符使用一个字节表示,汉字使用两个字节表示。 3. 数据结构 hello‑algo.com 46 3.4.3. Unicode 字符集 随着计算机的蓬勃发展,字符集与编码标准百0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 C++ 版− 20 = 11 元。 3. 从剩余可选项中拿出最大的 10 元,剩余 11 − 10 = 1 元。 4. 从剩余可选项中拿出最大的 1 元,剩余 1 − 1 = 0 元。 5. 完成找零,方案为 20 + 10 + 1 = 31 元。 第 1 章 初识算法 hello‑algo.com 13 图 1‑3 货币找零过程 在以上步骤中,我们每一步都采取当前看来最好的选择(尽可能用大面额的货币),最终得到了可行的找零方 构, 拼装积木的步骤则对应算法。 17 第 2 章 复杂度分析 Abstract 复杂度分析犹如浩瀚的算法宇宙中的时空向导。 它带领我们在时间与空间这两个维度上深入探索,寻找更优雅的解决方案。 第 2 章 复杂度分析 hello‑algo.com 18 2.1 算法效率评估 在算法设计中,我们先后追求以下两个层面的目标。 1. 找到问题解法:算法需要在规定的输入范围内可靠地求得问题的正确解。 主流排序算法的时间复杂度通常为 ?(? log ?) ,例如快速排序、归并排序、堆排序等。 7. 阶乘阶 ?(?!) 阶乘阶对应数学上的“全排列”问题。给定 ? 个互不重复的元素,求其所有可能的排列方案,方案数量为: ?! = ? × (? − 1) × (? − 2) × ⋯ × 2 × 1 阶乘通常使用递归实现。如图 2‑14 和以下代码所示,第一层分裂出 ? 个,第二层分裂出 ? − 1 个,以此类0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0 C++版− 20 = 11 元。 3. 从剩余可选项中拿出最大的 10 元,剩余 11 − 10 = 1 元。 4. 从剩余可选项中拿出最大的 1 元,剩余 1 − 1 = 0 元。 5. 完成找零,方案为 20 + 10 + 1 = 31 元。 第 1 章 初识算法 hello‑algo.com 13 图 1‑3 货币找零过程 在以上步骤中,我们每一步都采取当前看来最好的选择(尽可能用大面额的货币),最终得到了可行的找零方 式等代表数据结构, 拼装积木的步骤则对应算法。 17 第 2 章 复杂度分析 � 复杂度分析犹如浩瀚的算法宇宙中的时空向导。 它带领我们在时间与空间这两个维度上深入探索,寻找更优雅的解决方案。 第 2 章 复杂度分析 hello‑algo.com 18 2.1 算法效率评估 在算法设计中,我们先后追求以下两个层面的目标。 1. 找到问题解法:算法需要在规定的输入范围内可靠地求得问题的正确解。 主流排序算法的时间复杂度通常为 ?(? log ?) ,例如快速排序、归并排序、堆排序等。 7. 阶乘阶 ?(?!) 阶乘阶对应数学上的“全排列”问题。给定 ? 个互不重复的元素,求其所有可能的排列方案,方案数量为: ?! = ? × (? − 1) × (? − 2) × ⋯ × 2 × 1 阶乘通常使用递归实现。如图 2‑14 和以下代码所示,第一层分裂出 ? 个,第二层分裂出 ? − 1 个,以此类0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.0.0b5 C++版− 20 = 11 元。 3. 从剩余可选项中拿出最大的 10 元,剩余 11 − 10 = 1 元。 4. 从剩余可选项中拿出最大的 1 元,剩余 1 − 1 = 0 元。 5. 完成找零,方案为 20 + 10 + 1 = 31 元。 第 1 章 初识算法 hello‑algo.com 12 图 1‑3 货币找零过程 在以上步骤中,我们每一步都采取当前看来最好的选择(尽可能用大面额的货币),最终得到了可行的找零方 方式代表数据结构,拼 装积木的步骤则对应算法。 16 第 2 章 复杂度分析 � 复杂度分析犹如浩瀚的算法宇宙中的时空向导。 它带领我们在时间与空间这两个维度上深入探索,寻找更优雅的解决方案。 第 2 章 复杂度分析 hello‑algo.com 17 2.1 算法效率评估 在算法设计中,我们先后追求以下两个层面的目标。 1. 找到问题解法:算法需要在规定的输入范围内,可靠地求得问题的正确解。 主流排序算法的时间复杂度通常为 ?(? log ?) ,例如快速排序、归并排序、堆排序等。 7. 阶乘阶 ?(?!) 阶乘阶对应数学上的“全排列”问题。给定 ? 个互不重复的元素,求其所有可能的排列方案,方案数量为: ?! = ? × (? − 1) × (? − 2) × ⋯ × 2 × 1 阶乘通常使用递归实现。如图 2‑14 和以下代码所示,第一层分裂出 ? 个,第二层分裂出 ? − 1 个,以此类0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版− 20 = 11 元。 3. 从剩余可选项中拿出最大的 10 元,剩余 11 − 10 = 1 元。 4. 从剩余可选项中拿出最大的 1 元,剩余 1 − 1 = 0 元。 5. 完成找零,方案为 20 + 10 + 1 = 31 元。 第 1 章 初识算法 www.hello‑algo.com 13 图 1‑3 货币找零过程 在以上步骤中,我们每一步都采取当前看来最好的选择(尽可能 问题就会越深入,问题就能被解决得更优雅。 17 第 2 章 复杂度分析 Abstract 复杂度分析犹如浩瀚的算法宇宙中的时空向导。 它带领我们在时间与空间这两个维度上深入探索,寻找更优雅的解决方案。 第 2 章 复杂度分析 www.hello‑algo.com 18 2.1 算法效率评估 在算法设计中,我们先后追求以下两个层面的目标。 1. 找到问题解法:算法需要在规定的输入范围内可靠地求得问题的正确解。 主流排序算法的时间复杂度通常为 ?(? log ?) ,例如快速排序、归并排序、堆排序等。 7. 阶乘阶 ?(?!) 阶乘阶对应数学上的“全排列”问题。给定 ? 个互不重复的元素,求其所有可能的排列方案,方案数量为: ?! = ? × (? − 1) × (? − 2) × ⋯ × 2 × 1 阶乘通常使用递归实现。如图 2‑14 和以下代码所示,第一层分裂出 ? 个,第二层分裂出 ? − 1 个,以此类0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.2.0 繁体中文 C++ 版− 20 = 11 元。 3. 從剩餘可選項中拿出最大的 10 元,剩餘 11 − 10 = 1 元。 4. 從剩餘可選項中拿出最大的 1 元,剩餘 1 − 1 = 0 元。 5. 完成找零,方案為 20 + 10 + 1 = 31 元。 第 1 章 初識演算法 www.hello‑algo.com 13 圖 1‑3 貨幣找零過程 在以上步驟中,我們每一步都採取當前看來最好的選擇(儘可 問題就會越深入,問題就能被解決得更優雅。 17 第 2 章 複雜度分析 Abstract 複雜度分析猶如浩瀚的演算法宇宙中的時空嚮導。 它帶領我們在時間與空間這兩個維度上深入探索,尋找更優雅的解決方案。 第 2 章 複雜度分析 www.hello‑algo.com 18 2.1 演算法效率評估 在演算法設計中,我們先後追求以下兩個層面的目標。 1. 找到問題解法:演算法需要在規定的輸入範圍內可靠地求得問題的正確解。 主流排序演算法的時間複雜度通常為 ?(? log ?) ,例如快速排序、合併排序、堆積排序等。 7. 階乘階 ?(?!) 階乘階對應數學上的“全排列”問題。給定 ? 個互不重複的元素,求其所有可能的排列方案,方案數量為: ?! = ? × (? − 1) × (? − 2) × ⋯ × 2 × 1 階乘通常使用遞迴實現。如圖 2‑14 和以下程式碼所示,第一層分裂出 ? 個,第二層分裂出 ? − 1 個,以此0 码力 | 379 页 | 18.79 MB | 10 月前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理的存在是出于兼容性和性能的考虑。 << 取决于内存的随机值 编译器默认生成的构造函数:无参数( POD 陷阱解决方案) • 不过我们可以手动指定初始化 weight 为 0 。 • 通过 {} 语法指定的初始化值,会在编译器自 动生成的构造函数里执行。 编译器默认生成的构造函数:无参数( POD 陷阱解决方案,续) • 不过我们可以手动指定初始化 weight 为 0 。 • 通过 {} 语法指定的初始化值,不仅会在编译 您必须同时定义或删除拷贝构造函数和拷贝赋值函 数,否则出错。” 解决方案:要么删除 • 最简单的办法是,直接禁止用户拷贝这个 类的对象,在 C++11 中可以用 = delete 表示这个函数被删除,让编译器不要自动 生成一个默认的(会导致指针浅拷贝的) 拷贝构造函数了。 • 这样就可以在编译期提前发现错误: 解决方案:要么定义 • 如果需要允许用户拷贝你的 Vector 类对象 double free )的问题。 解决方案 1 :获取原始指针( C * 这种类型的指针) • 解决这个问题需要分两种情况讨论。 • 第一种是,你的 func() 实际上并不需要 “夺走”资源的占有权( ownership )。比如 刚才这个例子, func() 只是调用了 p 的 某个成员函数而已,并没有接过掌管对象 生命周期的大权。 解决方案 2 : unique_ptr 不能拷贝,但可以移动0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化么手动提取不变量到循环体外。 调用不在另一个文件的函数: SIMD 优化失败 因为编译器看不到那个文件的 other 函数里是什么,哪怕 other 在定义他的文件里是个空函数,他也不敢优化掉。 解决方案:放在同一个文件里 结论:避免在 for 循环体里调用外部函数,把他们移到 同一个文件里,或者放在头文件声明为 static 函数。 将 other 放到 和 func 同一个 .cpp 文件里,这样编译器看得到 我的程序就会变快? 错了,有可能不仅不变快,反而还变慢! SIMD 和缓存行对齐只是性能优 化的一个点,又不是全部。还要考虑结构体变大会导致内存带宽的占用, 对缓存的占用等一系列连锁反应,总之,要根据实际情况选择优化方案。 结构体的内存布局: AOS 与 SOA • AOS ( Array of Struct )单个对象的属性紧挨着存 • xyzxyzxyzxyz • SOA ( Struct of Array 的习惯,但常常不利于性能 SOA :分离存储多个属性 SIMD 矢量化成功! 不符合面向对象编程 (OOP) 的习惯,但常常有利于性能。 又称之为面向数据编程 (DOP) 。 AOSOA :中间方案 SIMD 矢量化成功! 4 个对象一组打包成 SOA ,再用一 个 n / 4 大小的数组存储为 AOS 。 优点: SOA 便于 SIMD 优化; AOS 便于存储在传统容器; AOSOA 两者得兼!是王鑫磊的最0 码力 | 108 页 | 9.47 MB | 1 年前3
共 24 条
- 1
- 2
- 3













