- 博客(951)
- 资源 (119)
- 收藏
- 关注
原创 CppCon 2019 学习:Deep CMake For Library Authors
API 设计不仅仅是让功能正常工作,还需要确保外部用户能清楚、简洁地理解如何使用它,同时保证内部实现的封装性和安全性。通过精心控制暴露的内容,可以有效提高代码的可维护性,减少潜在的错误或误用。类导出:通过将宏放在类定义前,控制类及其成员函数的导出。函数导出:使用来显式指定函数是否导出。全局变量导出:使用来控制全局变量的导出。在 CMake 中使用自动生成正确的宏定义,从而简化跨平台和跨编译器的符号导出管理。宏:通过和控制符号的导出和导入。CMake 的模块。
2025-07-16 14:56:33
593
原创 CppCon 2019 学习:The C++20 Synchronization Library
是一个返回 的函数,这意味着该函数返回一个异步任务,该任务将在未来某个时刻完成并返回一个 类型的结果。 是一个通用参数,用于提交异步任务的上下文或提交者(submitter)。这是为了使用类似于 Boost 库的提交者机制,允许任务被提交到一个线程池或者异步队列中执行。 是输入参数,表示计算 Fibonacci 数列的目标项。2. 终止条件:这是一个简单的终止条件:如果 小于 2(即 或 ),直接返回 。 表示协程的返回值, 是 C++20 协程中用来返回值的语法。3. 递归调用
2025-07-16 11:50:25
311
原创 CppCon 2019 学习:The C++20 Standard Library - Beyond Ranges
是 C++20 引入的用于格式化字符串的标准库函数,可以像 Python 一样使用{}占位符进行替换。cout << s;// 输出 "hello there world"这里{}会被对应的参数"hello"和"world"替换。支持各种内建类型的格式化,也允许扩展以支持自定义类型。如果你有自定义类型,可以通过特化来为这些类型实现格式化。break;break;break;上面的代码为my_color枚举类型提供了格式化支持。
2025-07-15 19:20:54
192
原创 CppCon 2019 学习:C++ Class Natures in their Canonical Form and how to find them
非规范示例中包含了多个错误,如拷贝构造函数、赋值操作符不当,应该避免在操作符和构造函数中使用const,除非有特殊的理由。规范示例使用了Rule of 5,通过为类提供默认的特殊函数来确保资源管理的正确性和避免手动编写重复的代码。编写自定义构造函数和赋值操作符时,需要特别小心,特别是在继承和资源管理方面。这个示例展示了如何正确实现 C++ 中的 Rule of 5(包括拷贝和移动构造函数及赋值操作符),确保在管理动态内存或其他资源时不会发生资源泄漏或重复释放问题。通过= default。
2025-07-15 15:53:32
255
原创 CppCon 2019 学习:Concurrency in C++20 and beyond
在长时间运行的操作中,GUI应用程序通常会有“取消”按钮,允许用户主动停止操作。然而,即使没有图形界面,某些操作也可能需要取消。直接强制停止线程并不可取,因为这样可能会导致不可预测的行为或资源泄露。C++20引入了 和 ,以支持协作式取消机制。这个机制是纯协作式的,意味着只有在目标任务主动检查停止请求时,任务才会被停止。如果任务没有检查停止标志,它将继续执行。 可以与 配合使用,这样如果代码正在等待某个事件发生,等待操作可以在收到停止请求时被中断。使用 自定义取消机制你还可以使用 提供自定义的取
2025-07-15 12:38:33
104
原创 CppCon 2019 学习:Concepts Evolution or Revolution?
过于具体的设计(类型转换过多、窄化转换等),可能导致代码难以维护和扩展,且容易引发错误。过于通用的设计(通用函数、复杂的编译时错误),虽然增加了灵活性,但可能带来额外的调试负担,且不一定在所有情况下都能提供最佳性能。这两段代码反映了过于具体和过于通用过于具体:函数限制了接受的参数类型,缺乏灵活性,可能导致无法处理其他类型的输入。过于通用:函数设计得过于宽泛,可能导致不合适的类型和错误的行为,尤其在处理不同类型的输入时。Concepts引用(int&)不是一个对象类型,它不能满足Object。
2025-07-15 10:14:55
376
原创 CppCon 2019 学习:Clang Based Refactoring How to refactor milions of lines of code without alienating y
传统for循环:使用迭代器显式控制循环的开始、结束和递增。现代化for循环:使用基于范围的for循环,简洁且易于维护,减少错误风险。Clang-Tidy:可以自动执行此类现代化代码风格转换,提升代码的可读性和简洁性。安装 Clang-Tidy:首先确保安装了 Clang-Tidy,可以通过包管理器或从源代码编译安装。命令行使用:通过clang-tidy命令检查单个文件或多个文件,指定编译器参数。CMake 集成:在 CMake 项目中启用 Clang-Tidy,自动检查代码。自动修复:使用。
2025-07-14 22:46:30
251
原创 CppCon 2019 学习:Catching The (Baseline) Unicode Plan for C++23
在C++中,处理Unicode字符一直以来都依赖于一些宏和特殊类型,直到C++20才正式解决了这个问题。char16_t和char32_t在C++20标准中明确与UTF-16和UTF-32的字符编码绑定,这样可以让开发者更轻松地处理Unicode,而不再需要依赖繁琐的宏和临时解决方案。C++流中的wchar_t编码问题即使在C++流处理中允许使用“多个代码单元”(multiple code units)来表示一个字符,wchar_t仍然是个问题。这里的意思是,wchar_t。
2025-07-14 15:16:47
275
原创 CppCon 2019 学习:BACK TO BASICS: VIRTUAL DISPATCH AND ITS ALTERNATIVES
虚派发 (Virtual Dispatch) 是面向对象编程 (OOP) 中的一个重要概念,尤其是在多态性实现时非常关键。理解虚派发和它的替代方案有助于你深入理解 C++ 的面向对象特性以及性能优化技巧。接下来,我们详细分析一下这个主题。虚派发是实现动态多态性的核心。它允许程序在运行时确定调用哪个版本的函数,而不仅仅是编译时确定。这通常通过使用虚函数()来实现。在这个例子中,尽管 的类型是 ,但由于 是一个虚函数,运行时会调用 类的 方法。虽然虚派发在许多场景中很有效,但它也有一些缺点,尤其是性能
2025-07-14 12:19:48
761
原创 CppCon 2019 学习:Back to Basics: Type Erasure
模板方法:使用模板接受任何类型的可调用对象(如 lambda)。简单但可能导致代码膨胀和编译时间较长。类型擦除方法:使用如等库类型来封装 lambda 表达式,避免模板化带来的问题,使得函数接口更加灵活。qsort_r提供了一种比传统qsort更灵活的排序方式,它允许我们在比较函数中传递额外的上下文信息,从而避免了使用全局变量。通过这种方式,比较函数变得更加通用,可以根据不同的需求进行排序。qsort:适用于简单的排序任务,比较函数只需要关心两个元素的关系。qsort_r。
2025-07-14 11:01:49
984
原创 CppCon 2019 学习:Back To Basics: The Best Parts of C++
C++ 语言有一个标准,它是一个国际公认的文档,规定了编译器和程序的行为。这个标准非常重要,它使得我们能够确保不同的编译器和程序实现之间的行为一致。C++ 标准是保证编译器和程序行为一致的关键,它是国际化的文档,确保了我们使用 C++ 时的一致性和可靠性。我们来分析你提供的 C++ 代码和相应的汇编代码。这段 C++ 代码做了以下几件事:现在让我们逐行分析对应的汇编代码:汇编代码与 C++ 代码的对应关系 函数::为局部变量(例如 和 )分配栈空间。这是栈帧的管理操作,确保有足够的空间来存
2025-07-14 09:39:45
727
原创 CppCon 2019 学习:Back to Basics:Smart Pointers
C++11 引入了一些智能指针类型,用来管理动态分配的内存并帮助避免内存泄漏。每种智能指针有不同的用途和特点。下面是对这些智能指针的简要中文解释:1. 创建堆分配对象:通过 创建一个堆分配的 对象,并将其包装在 中。 会在创建对象时同时分配智能指针的内存,相较于直接用 创建对象,它更高效,且提供了异常安全性。 是一个 : 持有 对象的共享所有权。这意味着可以有多个 指向同一个对象,当最后一个 离开作用域时, 对象会被自动销毁。2. 拷贝 :这行代码将 赋值给 ,因为 是引用
2025-07-13 20:19:02
859
原创 CppCon 2019 学习:Back to Basics:RAII and the Rule of Zero
“资源管理类(Classes that manage resources)”,在 C++ 里我们经常需要手动管理某些资源,而这类类的设计正是为了自动、安全地管理这些资源,防止资源泄漏或误用。资源管理类:在这里,“资源”指的是那些需要特殊(也就是手动)管理的东西。C++ 程序中,常常需要管理各种不同类型的资源。动态分配的内存(如:用 或 、 分配和释放的内存)POSIX 文件句柄(使用 打开, 关闭的文件)C 标准库的文件句柄(用 打开, 关闭的文件)互斥锁(mutex)(通过 上锁,
2025-07-13 17:22:16
765
原创 CppCon 2019 学习:Back to Basics: Object Oriented Programming
每个对象实现相同的接口(API),就像不同的“库”。调用者只依赖抽象接口Logger,无需知道对象的具体类型。实现了模块化、解耦和可扩展性,是良好的 OOP 实践。项目解释Liskov 替换原则子类应当能替代父类,并保证程序语义不变的问题它实现了接口但违背了原意(直接退出程序而不是记录日志)风险会导致调用方代码行为异常、崩溃或逻辑错误正确做法子类应保持与父类语义一致,仅扩展功能而不破坏预期行为术语含义接口(API)基类定义的公共操作,如语义这些函数的预期行为。
2025-07-13 13:10:28
361
原创 CppCon 2019 学习:Back to Basics: Move Semantics
/ 这是一个转发引用// 这也是一个转发引用转发引用:当模板参数T被推导且函数参数是T&&时,就是转发引用。它的特殊之处是:如果传入的实参是左值,T会推导为引用类型(比如Widget&),根据引用折叠规则,T&&实际变为左值引用Widget&。如果传入的是右值,T推导为普通类型(Widget),T&&是右值引用。转发引用是模板参数推导结合右值引用的特例,自动适应传入参数是左值还是右值。通过引用折叠规则,实现参数类型自动转换为左值引用或右值引用。
2025-07-13 12:30:44
250
原创 CppCon 2019 学习:Back to Basics: Move Semantics
通过理解和使用移动语义,我们可以大幅提高程序性能,避免不必要的数据拷贝。std::move和右值引用让我们可以在不创建多余副本的情况下高效地转移资源。这段代码展示了 C++ 中如何使用移动语义来避免不必要的拷贝,提高性能。通过std::move可以将一个对象的资源转移给另一个对象,而不是复制其内容。C++中的新特殊成员函数与移动构造函数在 C++ 中,特殊成员函数用于管理对象的生命周期、内存管理和资源管理。这些成员函数包括构造函数、拷贝构造函数、拷贝赋值运算符、析构函数等。随着 C++11 引入了移动语义。
2025-07-12 22:29:56
310
原创 CppCon 2019 学习:Back to Basics: Lambdas from Scratch
这些示例展示了 C++ 中不同类型的函数:普通函数、函数重载、函数模板以及类成员函数。在汇编层面,编译器为每种不同类型的函数生成了不同的实现,具体的指令如lealaddsd和addl用于执行加法操作。每种类型的函数都处理不同的数据类型,且函数的调用会根据传入的类型来选择相应的实现。C++ 中的 lambda 表达式是非常强大的工具,可以显著简化代码,减少样板代码。通过不同的捕获方式(按值、按引用、按移动),你可以精确控制变量的生命周期和所有权。
2025-07-12 21:52:36
356
原创 CppCon 2019 学习:Atomics, Locks, and Tasks
使用std::mutex保护共享变量,防止数据竞争,但会带来性能开销。线程间多个锁操作时,必须避免死锁,推荐用std::lock或实现原子锁定多个互斥锁。对于高频率的共享计数,原子操作比锁更高效。通过局部变量累积减少原子操作次数,可以进一步提升性能。最重要的并发原则是**“尽量不要共享状态”**。线程 vs 任务:任务模型更高层,方便管理返回值和异常。锁和条件变量:解决共享状态访问和线程间同步。std::async和并行 STL:简化并行编程,提升性能。
2025-07-12 20:55:19
285
原创 CppCon 2019 学习:Avoid Misuse of Contracts
将传入的迭代器向前或向后移动n个位置。分类说明前置条件函数执行前必须满足的条件,否则行为未定义后置条件函数执行后应该达到的状态本质行为函数核心语义与性能特性窄契约有前置条件,调用者需小心处理宽契约无前置条件,调用更安全当调用抛异常:适合高可靠性场景,函数强制保证输入正确。返回 0 或 NaN:简化处理,但不安全,容易误导。改为返回 optional 或 expected:结果可能不存在。:结果或错误共存。其他自定义处理方式:如断言、日志等。问题点说明可行性差。
2025-07-12 20:04:17
355
原创 CppCon 2019 学习: Asynchronous Programming in Modern C++
设计目标:尽可能与 C++11/14/17/20 标准库保持一致HPX 提供的接口在风格与语义上尽可能接近 C++ 标准库已有或提案中的并发/并行组件,使开发者能无缝过渡并利用已有知识。HPX 在设计上最大程度复用并扩展 C++ 标准语义,不仅兼容原有 C++ 编程模型,还加入了异步与并行能力的增强版本,帮助开发者快速构建高效、现代的并发/分布式程序。通过 命名空间下的组件,HPX 将标准库的同步、任务调度和并行操作能力拓展到了更大规模和异构系统中。2. 3. / 4. 5. vs
2025-07-12 19:08:17
389
原创 CppCon 2019 学习:Are We Macro-free Yet?
提高代码的类型安全性、可读性和可维护性,并减少对宏的依赖。宏由于其文本替换的特性,容易引入错误,因此,现代 C++ 提倡使用更加安全、灵活的特性,如模板、constexprdecltype、lambda 表达式等来替代宏。如果你正在进行代码迁移或重构,采用这些现代 C++ 特性将有助于提高代码的质量和长期可维护性。如果你有具体的代码或迁移问题,随时可以交流,帮助你更好地理解这些概念并应用到实际项目中。条件编译是编程中通过特定条件控制哪些代码会被编译的过程。
2025-07-08 13:18:24
553
原创 CppCon 2019 学习:AN OVERVIEW OF STANDARD RANGES
哨兵(Sentinel)是表示范围结束的特殊对象,与传统的迭代器不同,它不一定指向一个有效的元素,只需要与迭代器进行比较来标记范围的结束。哨兵可以简化一些算法的实现,例如find函数,使得代码更加简洁,且在某些情况下能够更好地进行代码生成优化。C++20 中的ranges引入了哨兵的概念,提供了新的 API,如和,它们使用哨兵而不是迭代器来表示范围的终点。Projections (投影) 在 C++20 中的理解在 C++20 中,Projections(投影)是一种。
2025-07-08 00:23:16
775
原创 CppCon 2019 学习:Abseil’s Open Source Hashtable
是基于平坦数组的高效哈希集合实现,优化了内存和性能,避免了传统哈希表中的链表结构。和使得哈希表的实现更加高效和灵活。Slot Array和Group的设计可以优化哈希表的存储和访问方式,提高查找、插入和删除的效率。这些概念结合在一起,形成了一个非常高效的哈希集合实现,广泛应用于高性能计算场景中。cmake 添加 find_package(absl REQUIRED)# 添加可执行文件# 链接Benchmark库和pthreadabsl::baseabsl::hash。
2025-07-07 22:26:37
995
原创 CppCon 2019 学习:A Universal Abstraction for Async
这段代码实现了一个简单的异步框架,通过Promise和Future模式,允许将多个异步任务链式组合在一起。每个任务可以在异步计算中延迟执行,且可以通过同步sync_wait来获取任务的最终结果。这种模式非常适合处理复杂的异步计算场景,尤其是在多线程环境下。
2025-07-07 19:02:09
935
原创 CppCon 2019 学习:A Series of Unfortunate Bugs
来检查某个条件是否满足。如果条件不成立,程序会抛出断言失败的错误。在调试过程中,你可以通过调整编译选项来查找潜在问题。在这段代码中,程序使用了一个断言。
2025-07-07 18:21:16
504
原创 CppCon 2019 学习:A C++ Approach to Physical Units
火星气候轨道探测器(Mars Climate Orbiter) 是 NASA 发射的一颗机器人太空探测器,下面是一些关键的背景信息:这段文字介绍了 火星气候轨道探测器 的发射背景、任务成本和具体的操作细节,特别提到了探测器的发射日期和任务的一个关键节点——轨道插入。失败的主要原因是单位不一致,具体来说:这个错误是由于两套系统(分别由 Lockheed Martin 和 NASA 提供)在单位系统上的不一致,导致了数据计算的混乱,从而使得火星气候轨道探测器的任务失败。“Pound” 在此上下文中可能指的是
2025-07-07 18:06:42
773
原创 CppCon 2019 学习:Algorithmic Journeys with Concepts
Douglas McIlroy 是著名的计算机科学家,提出了很多关于软件工程、程序设计和算法的重要思想。泛型编程的本质泛型编程的本质在于概念(Concepts)。概念是描述一类相关对象类型的方式。在自然科学中,概念类似于属(genus)和种(species)的关系。通过定义这些概念,我们可以形成一种对特定问题的普遍模型。在数学中,概念是通过类型或类(type or class)来描述对象的。在编程中,概念的模型通常会涉及具体的类型或类,例如整数类型、字符类型等。定义:Datum(数据单元)
2025-07-07 17:34:26
732
原创 CppCon 2018 学习:CodeChecker: A static analysis infrastructure built on the LLVM/Clang Static Analyzer
CodeChecker 是一个静态分析工具,借助 LLVM/Clang 静态分析工具链的强大功能,可以自动检测源代码中的潜在缺陷。它通过生成易于理解的报告,帮助开发者发现并修复问题,提升代码质量。是一个静态分析基础设施,旨在为 C/C++ 项目运行多个静态分析工具。将多个静态分析工具集成到构建系统中可能既复杂又耗时。通过 CodeChecker,目标是创建一个易于集成到各种构建系统中的工具,能够运行多个静态分析器,并帮助管理分析器提供的结果。CodeChecker的目标和背景集成多个分析工具。
2025-07-07 15:44:37
406
原创 CppCon 2018 学习:A C++ Tasking Framework with Compile-Time Dispatching and Type-Driven Priority Schedu
是决定一个任务是否能按时完成的关键时间指标,超出该时间可能会影响系统的功能或性能。在高频交易、深度学习、游戏开发、网络通信、天体物理学等领域,都有着不同的应用,通常意味着优化任务的调度、执行速度和网络延迟。时间单位如纳秒(ns)微秒(us)毫秒(ms)等常用于度量这些任务的执行时间或延迟。这个系统的目标是通过静态调度和类型驱动的优先级机制,高效地调度不同类型的任务。每个任务根据其类型被分配到不同的队列中(如 FIFO 或 LIFO)。
2025-07-07 15:38:57
568
原创 CppCon 2018 学习:Trivially Relocatable
当分配一个新的、更大的内存块。将现有元素从旧内存块复制(或移动)到新内存块,这个过程就是所谓的重定位。更新内部指针ptr,并释放旧的内存块。重定位是为了保证向量可以在需要时动态增长,并且在扩展过程中保持元素的连续性。这是动态调整大小时的常见操作。“重定位(relocation)”当向添加元素并且超出了当前容量时,重定位就会发生。向量会分配一个更大的内存块,通常是原来内存容量的两倍。然后,向量会将原有元素从旧内存块移动到新的内存块,并更新指针。最后,旧内存块会被释放。“重定位”
2025-07-07 15:14:48
923
原创 CppCon 2018 学习:rof_egnar reversed adapter for(auto x:reversed(range))
reverse通过使用std::move来转移右值容器的所有权,我们解决了左值引用和右值对象不匹配的问题,成功编译并正常运行了代码。如果你还有其他问题,或者对这部分有更多疑问,请随时告诉我!使用初始化列表时,可以通过显式指定模板类型或特化reverse来支持。C++17 引入的模板类型推导(CTAD)在某些情况下无法自动推导初始化列表的类型,需要开发者显式指定或特化构造函数。从临时对象中引用元素或获取迭代器是危险的,因为临时对象的生命周期很短,它们在使用后很快被销毁,导致悬空引用和无效化的迭代器。
2025-07-07 14:52:07
634
原创 CppCon 2018 学习:QT SIGNALS AND THE COROUTINES
这个例子演示了如何使用 Qt 信号与槽机制来实现一个简单的交互式绘制工具,通过两次点击来确定直线的两个端点。信号与槽机制在这里的关键作用是响应用户的点击事件并在相应的槽函数中处理绘制逻辑。这个例子展示了如何将 Qt 的信号与 C++20 协程结合使用,通过将信号转换为协程可以等待的对象,使得异步编程更加直观。协程让我们能够以同步的方式编写异步代码,避免了回调地狱和复杂的状态管理。这段代码展示了如何使用 C++20 协程与 Qt 信号槽机制结合来处理异步事件。通过将信号包装成awaitable。
2025-07-07 13:03:40
723
原创 CppCon 2018 学习:Fixing Two-Phase Initialization
是一种处理复杂初始化过程的方法,通过将构造和初始化分开,可以更灵活地管理对象的状态和资源分配。需要在对象构造时保持简单,不做复杂的资源初始化。资源的初始化可能会失败,需要处理初始化失败的场景。对象的初始化依赖于外部信息或配置,不能在构造时立即进行。这段代码展示了一个典型的两阶段初始化的设计模式,首先通过默认构造函数进行基本构造,然后通过一个独立的init方法进行实际的初始化。反向两阶段初始化分离了对象的创建和初始化过程,确保对象在构造之前已经被完全初始化。使用。
2025-07-07 12:10:28
528
原创 CppCon 2018 学习:[B00ST].DI INJECT ALL THE THINGS!
依赖注入:通过boost::di库,类不再自己创建Database和Logger对象,而是通过依赖注入容器来管理这些依赖。解耦:这使得类与具体的Database和Logger实现解耦,增强了代码的可维护性和可测试性。容器的作用:Boost.DI 容器负责管理依赖对象的生命周期,并在运行时自动注入到需要它们的类中。这种方式在大型系统中尤其有用,可以很方便地替换不同的依赖实现,而无需修改依赖的类本身。手动依赖注入:通过显式创建数据并传递给构造函数来注入依赖。例如,我们手动创建了一个包含名字的。
2025-07-07 11:58:43
902
原创 CppCon 2018 学习:Big Infrastructure at a Small Scale
你现在面临的是一个相当庞大的遗留项目,但解决这个问题的办法是逐步改进,从小的地方做起,并逐步建立起一套统一的开发规范和流程,以减轻后续开发的负担。改善代码结构和文档化,逐步进行代码重构和模块化。规范项目管理,统一构建和依赖管理。改善Bug追踪和开发流程,引入敏捷开发理念。建立标准的分支和部署策略,通过自动化提高效率。Mermaid提供了一个叫做gitGraph的功能,专门用于绘制 Git 工作流的图形。它可以帮助开发者更清晰地理解 Git 分支和合并操作。以下是关于的基础教程,展示了如何使用。
2025-07-07 11:18:48
364
原创 CppCon 2018 学习:Writing Standard Library Compliant Data Structures and Algorithms
(用于只读遍历)和(用于可读写遍历)。它们支持标准的迭代器操作,如解引用、递增、递减和比较。通过继承和扩展了基本的迭代器接口,使得有向图的遍历可以按照标准的迭代器模式来进行。assign()方法使得可以通过迭代器范围或来赋值给图。支持的构造函数和赋值运算符,使得图的初始化更加简洁。insert()方法改进,返回一个std::pair,使得可以获取插入位置和是否插入成功。erase()方法改进,支持通过迭代器删除单个元素或区间元素,并返回新的迭代器。这些更新使得迭代器支持。
2025-07-07 09:56:51
1021
原创 CppCon 2018 学习:Woes of Scope Guards and Unique_Resource
这个设计的目标是通过模板和std::tuple提供一种通用的资源管理方式。尽管从实现上看,它的核心思想是通过 RAII 管理多个资源的生命周期,但它有一些明显的缺点,尤其是对于不可移动或不可复制的资源,或者需要特定释放顺序的资源来说,这种方法可能不适用。过于简单的设计:它没有考虑到很多实际场景中资源的特殊要求,特别是对于线程安全、资源顺序释放等问题的处理。泛型 RAII可能面临的一些挑战包括如何处理各种不同类型的资源,如何保证资源按正确的顺序释放等。
2025-07-06 22:32:09
604
原创 CppCon 2018 学习:What do you mean “thread-safe“
线程安全”指的是一个函数、方法或代码块能够在多个线程同时执行时,不会出现意外的交互或破坏共享数据,能够安全地运行。POSIX 对线程安全的定义很清楚:“一个线程安全的函数可以在多个线程中被安全地并发调用,无论是与同一个函数的其他调用,还是与其他线程安全函数的调用。这意味着,当多个线程同时调用一个函数时,这个函数应该能够正常工作,而不会导致数据破坏或未定义的行为。竞态条件。
2025-07-06 21:49:25
700
原创 CppCon 2018 学习:What Do We Mean When We Say Nothing At All?
表达意图的清晰性是编写可维护代码的关键。通过使用适当的关键字(如overridenoexcept等),标明函数行为,帮助其他开发者更容易理解代码的设计。明确代码意图:尽量避免默认值,确保参数传递方式清晰,函数的返回值明确,并使用注释澄清潜在的误解。一致性:通过在整个代码库中一致使用关键字和模式,增强代码的可读性和可维护性。这部分内容探讨了如何通过代码中隐含的设计选择,传达更多的意图和信息,进而提高代码的可读性和可维护性。
2025-07-06 21:33:54
549
Real-Time C++, 2nd Edition.pdf
2018-06-17
OpenGL ES 3dot0 Cookbook
2018-06-17
OpenCV 3 Blueprints.pdf
2018-06-17
Data Structures & Algorithm Analysis in C++, 4th Edition.pdf
2018-06-17
Learning Boost C++ Libraries.pdf
2018-06-17
OpenCV Computer Vision with Python.pdf
2018-06-17
OpenGL 4 Shading Language Cookbook, Second Edition
2018-06-17
OpenGL Data Visualization Cookbook
2018-06-17
A Practical Introduction to Computer Vision with OpenCV.pdf
2018-06-17
Functional Programming with C++
2018-06-17
Procedural Content Generation for C++ Game Development.pdf
2018-06-17
OpenGL Programming Guide, 8th Edition
2018-06-17
Arduino Computer Vision Programming.pdf
2018-06-17
OpenCV Computer Vision Application Programming Cookbook Second Edition.pdf
2018-06-17
OpenCV 2 Computer Vision Application Programming Cookbook
2018-06-17
Data Clustering in C++.pdf
2018-06-17
Learning Image Processing with OpenCV.pdf
2018-06-17
Practical Algorithms for 3D Computer Graphics, Second Edition.pdf
2018-06-17
Game Programming Using QT.pdf
2018-06-17
Multicore and GPU Programming An Integrated Approach.pdf
2019-03-21
OGLPG-9th-Edition.zip OpenGL编程指南代码(包括资源文件)
2019-10-23
OpenGL 4.5 Reference Pages API + GLSLangSpec.4.60 + glspec46.core
2019-10-22
OGRE 3D 1.7 Application Development Cookbook.pdf
2019-04-20
UNIX网络编程卷1:套接字联网API(第3版) (1).pdf
2019-04-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人