- 博客(938)
- 资源 (119)
- 收藏
- 关注
原创 CppCon 2019 学习:Back to Basics: Object Oriented Programming
每个对象实现相同的接口(API),就像不同的“库”。调用者只依赖抽象接口Logger,无需知道对象的具体类型。实现了模块化、解耦和可扩展性,是良好的 OOP 实践。项目解释Liskov 替换原则子类应当能替代父类,并保证程序语义不变的问题它实现了接口但违背了原意(直接退出程序而不是记录日志)风险会导致调用方代码行为异常、崩溃或逻辑错误正确做法子类应保持与父类语义一致,仅扩展功能而不破坏预期行为术语含义接口(API)基类定义的公共操作,如语义这些函数的预期行为。
2025-07-13 13:10:28
199
原创 CppCon 2019 学习:Back to Basics: Move Semantics
/ 这是一个转发引用// 这也是一个转发引用转发引用:当模板参数T被推导且函数参数是T&&时,就是转发引用。它的特殊之处是:如果传入的实参是左值,T会推导为引用类型(比如Widget&),根据引用折叠规则,T&&实际变为左值引用Widget&。如果传入的是右值,T推导为普通类型(Widget),T&&是右值引用。转发引用是模板参数推导结合右值引用的特例,自动适应传入参数是左值还是右值。通过引用折叠规则,实现参数类型自动转换为左值引用或右值引用。
2025-07-13 12:30:44
155
原创 CppCon 2019 学习:Back to Basics: Move Semantics
通过理解和使用移动语义,我们可以大幅提高程序性能,避免不必要的数据拷贝。std::move和右值引用让我们可以在不创建多余副本的情况下高效地转移资源。这段代码展示了 C++ 中如何使用移动语义来避免不必要的拷贝,提高性能。通过std::move可以将一个对象的资源转移给另一个对象,而不是复制其内容。C++中的新特殊成员函数与移动构造函数在 C++ 中,特殊成员函数用于管理对象的生命周期、内存管理和资源管理。这些成员函数包括构造函数、拷贝构造函数、拷贝赋值运算符、析构函数等。随着 C++11 引入了移动语义。
2025-07-12 22:29:56
212
原创 CppCon 2019 学习:Back to Basics: Lambdas from Scratch
这些示例展示了 C++ 中不同类型的函数:普通函数、函数重载、函数模板以及类成员函数。在汇编层面,编译器为每种不同类型的函数生成了不同的实现,具体的指令如lealaddsd和addl用于执行加法操作。每种类型的函数都处理不同的数据类型,且函数的调用会根据传入的类型来选择相应的实现。C++ 中的 lambda 表达式是非常强大的工具,可以显著简化代码,减少样板代码。通过不同的捕获方式(按值、按引用、按移动),你可以精确控制变量的生命周期和所有权。
2025-07-12 21:52:36
192
原创 CppCon 2019 学习:Atomics, Locks, and Tasks
使用std::mutex保护共享变量,防止数据竞争,但会带来性能开销。线程间多个锁操作时,必须避免死锁,推荐用std::lock或实现原子锁定多个互斥锁。对于高频率的共享计数,原子操作比锁更高效。通过局部变量累积减少原子操作次数,可以进一步提升性能。最重要的并发原则是**“尽量不要共享状态”**。线程 vs 任务:任务模型更高层,方便管理返回值和异常。锁和条件变量:解决共享状态访问和线程间同步。std::async和并行 STL:简化并行编程,提升性能。
2025-07-12 20:55:19
164
原创 CppCon 2019 学习:Avoid Misuse of Contracts
将传入的迭代器向前或向后移动n个位置。分类说明前置条件函数执行前必须满足的条件,否则行为未定义后置条件函数执行后应该达到的状态本质行为函数核心语义与性能特性窄契约有前置条件,调用者需小心处理宽契约无前置条件,调用更安全当调用抛异常:适合高可靠性场景,函数强制保证输入正确。返回 0 或 NaN:简化处理,但不安全,容易误导。改为返回 optional 或 expected:结果可能不存在。:结果或错误共存。其他自定义处理方式:如断言、日志等。问题点说明可行性差。
2025-07-12 20:04:17
186
原创 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
231
原创 CppCon 2019 学习:Are We Macro-free Yet?
提高代码的类型安全性、可读性和可维护性,并减少对宏的依赖。宏由于其文本替换的特性,容易引入错误,因此,现代 C++ 提倡使用更加安全、灵活的特性,如模板、constexprdecltype、lambda 表达式等来替代宏。如果你正在进行代码迁移或重构,采用这些现代 C++ 特性将有助于提高代码的质量和长期可维护性。如果你有具体的代码或迁移问题,随时可以交流,帮助你更好地理解这些概念并应用到实际项目中。条件编译是编程中通过特定条件控制哪些代码会被编译的过程。
2025-07-08 13:18:24
550
原创 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
764
原创 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
982
原创 CppCon 2019 学习:A Universal Abstraction for Async
这段代码实现了一个简单的异步框架,通过Promise和Future模式,允许将多个异步任务链式组合在一起。每个任务可以在异步计算中延迟执行,且可以通过同步sync_wait来获取任务的最终结果。这种模式非常适合处理复杂的异步计算场景,尤其是在多线程环境下。
2025-07-07 19:02:09
931
原创 CppCon 2019 学习:A Series of Unfortunate Bugs
来检查某个条件是否满足。如果条件不成立,程序会抛出断言失败的错误。在调试过程中,你可以通过调整编译选项来查找潜在问题。在这段代码中,程序使用了一个断言。
2025-07-07 18:21:16
503
原创 CppCon 2019 学习:A C++ Approach to Physical Units
火星气候轨道探测器(Mars Climate Orbiter) 是 NASA 发射的一颗机器人太空探测器,下面是一些关键的背景信息:这段文字介绍了 火星气候轨道探测器 的发射背景、任务成本和具体的操作细节,特别提到了探测器的发射日期和任务的一个关键节点——轨道插入。失败的主要原因是单位不一致,具体来说:这个错误是由于两套系统(分别由 Lockheed Martin 和 NASA 提供)在单位系统上的不一致,导致了数据计算的混乱,从而使得火星气候轨道探测器的任务失败。“Pound” 在此上下文中可能指的是
2025-07-07 18:06:42
735
原创 CppCon 2019 学习:Algorithmic Journeys with Concepts
Douglas McIlroy 是著名的计算机科学家,提出了很多关于软件工程、程序设计和算法的重要思想。泛型编程的本质泛型编程的本质在于概念(Concepts)。概念是描述一类相关对象类型的方式。在自然科学中,概念类似于属(genus)和种(species)的关系。通过定义这些概念,我们可以形成一种对特定问题的普遍模型。在数学中,概念是通过类型或类(type or class)来描述对象的。在编程中,概念的模型通常会涉及具体的类型或类,例如整数类型、字符类型等。定义:Datum(数据单元)
2025-07-07 17:34:26
729
原创 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
401
原创 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
566
原创 CppCon 2018 学习:Trivially Relocatable
当分配一个新的、更大的内存块。将现有元素从旧内存块复制(或移动)到新内存块,这个过程就是所谓的重定位。更新内部指针ptr,并释放旧的内存块。重定位是为了保证向量可以在需要时动态增长,并且在扩展过程中保持元素的连续性。这是动态调整大小时的常见操作。“重定位(relocation)”当向添加元素并且超出了当前容量时,重定位就会发生。向量会分配一个更大的内存块,通常是原来内存容量的两倍。然后,向量会将原有元素从旧内存块移动到新的内存块,并更新指针。最后,旧内存块会被释放。“重定位”
2025-07-07 15:14:48
921
原创 CppCon 2018 学习:rof_egnar reversed adapter for(auto x:reversed(range))
reverse通过使用std::move来转移右值容器的所有权,我们解决了左值引用和右值对象不匹配的问题,成功编译并正常运行了代码。如果你还有其他问题,或者对这部分有更多疑问,请随时告诉我!使用初始化列表时,可以通过显式指定模板类型或特化reverse来支持。C++17 引入的模板类型推导(CTAD)在某些情况下无法自动推导初始化列表的类型,需要开发者显式指定或特化构造函数。从临时对象中引用元素或获取迭代器是危险的,因为临时对象的生命周期很短,它们在使用后很快被销毁,导致悬空引用和无效化的迭代器。
2025-07-07 14:52:07
633
原创 CppCon 2018 学习:QT SIGNALS AND THE COROUTINES
这个例子演示了如何使用 Qt 信号与槽机制来实现一个简单的交互式绘制工具,通过两次点击来确定直线的两个端点。信号与槽机制在这里的关键作用是响应用户的点击事件并在相应的槽函数中处理绘制逻辑。这个例子展示了如何将 Qt 的信号与 C++20 协程结合使用,通过将信号转换为协程可以等待的对象,使得异步编程更加直观。协程让我们能够以同步的方式编写异步代码,避免了回调地狱和复杂的状态管理。这段代码展示了如何使用 C++20 协程与 Qt 信号槽机制结合来处理异步事件。通过将信号包装成awaitable。
2025-07-07 13:03:40
715
原创 CppCon 2018 学习:Fixing Two-Phase Initialization
是一种处理复杂初始化过程的方法,通过将构造和初始化分开,可以更灵活地管理对象的状态和资源分配。需要在对象构造时保持简单,不做复杂的资源初始化。资源的初始化可能会失败,需要处理初始化失败的场景。对象的初始化依赖于外部信息或配置,不能在构造时立即进行。这段代码展示了一个典型的两阶段初始化的设计模式,首先通过默认构造函数进行基本构造,然后通过一个独立的init方法进行实际的初始化。反向两阶段初始化分离了对象的创建和初始化过程,确保对象在构造之前已经被完全初始化。使用。
2025-07-07 12:10:28
526
原创 CppCon 2018 学习:[B00ST].DI INJECT ALL THE THINGS!
依赖注入:通过boost::di库,类不再自己创建Database和Logger对象,而是通过依赖注入容器来管理这些依赖。解耦:这使得类与具体的Database和Logger实现解耦,增强了代码的可维护性和可测试性。容器的作用:Boost.DI 容器负责管理依赖对象的生命周期,并在运行时自动注入到需要它们的类中。这种方式在大型系统中尤其有用,可以很方便地替换不同的依赖实现,而无需修改依赖的类本身。手动依赖注入:通过显式创建数据并传递给构造函数来注入依赖。例如,我们手动创建了一个包含名字的。
2025-07-07 11:58:43
896
原创 CppCon 2018 学习:Big Infrastructure at a Small Scale
你现在面临的是一个相当庞大的遗留项目,但解决这个问题的办法是逐步改进,从小的地方做起,并逐步建立起一套统一的开发规范和流程,以减轻后续开发的负担。改善代码结构和文档化,逐步进行代码重构和模块化。规范项目管理,统一构建和依赖管理。改善Bug追踪和开发流程,引入敏捷开发理念。建立标准的分支和部署策略,通过自动化提高效率。Mermaid提供了一个叫做gitGraph的功能,专门用于绘制 Git 工作流的图形。它可以帮助开发者更清晰地理解 Git 分支和合并操作。以下是关于的基础教程,展示了如何使用。
2025-07-07 11:18:48
357
原创 CppCon 2018 学习:Writing Standard Library Compliant Data Structures and Algorithms
(用于只读遍历)和(用于可读写遍历)。它们支持标准的迭代器操作,如解引用、递增、递减和比较。通过继承和扩展了基本的迭代器接口,使得有向图的遍历可以按照标准的迭代器模式来进行。assign()方法使得可以通过迭代器范围或来赋值给图。支持的构造函数和赋值运算符,使得图的初始化更加简洁。insert()方法改进,返回一个std::pair,使得可以获取插入位置和是否插入成功。erase()方法改进,支持通过迭代器删除单个元素或区间元素,并返回新的迭代器。这些更新使得迭代器支持。
2025-07-07 09:56:51
1014
原创 CppCon 2018 学习:Woes of Scope Guards and Unique_Resource
这个设计的目标是通过模板和std::tuple提供一种通用的资源管理方式。尽管从实现上看,它的核心思想是通过 RAII 管理多个资源的生命周期,但它有一些明显的缺点,尤其是对于不可移动或不可复制的资源,或者需要特定释放顺序的资源来说,这种方法可能不适用。过于简单的设计:它没有考虑到很多实际场景中资源的特殊要求,特别是对于线程安全、资源顺序释放等问题的处理。泛型 RAII可能面临的一些挑战包括如何处理各种不同类型的资源,如何保证资源按正确的顺序释放等。
2025-07-06 22:32:09
603
原创 CppCon 2018 学习:What do you mean “thread-safe“
线程安全”指的是一个函数、方法或代码块能够在多个线程同时执行时,不会出现意外的交互或破坏共享数据,能够安全地运行。POSIX 对线程安全的定义很清楚:“一个线程安全的函数可以在多个线程中被安全地并发调用,无论是与同一个函数的其他调用,还是与其他线程安全函数的调用。这意味着,当多个线程同时调用一个函数时,这个函数应该能够正常工作,而不会导致数据破坏或未定义的行为。竞态条件。
2025-07-06 21:49:25
699
原创 CppCon 2018 学习:What Do We Mean When We Say Nothing At All?
表达意图的清晰性是编写可维护代码的关键。通过使用适当的关键字(如overridenoexcept等),标明函数行为,帮助其他开发者更容易理解代码的设计。明确代码意图:尽量避免默认值,确保参数传递方式清晰,函数的返回值明确,并使用注释澄清潜在的误解。一致性:通过在整个代码库中一致使用关键字和模式,增强代码的可读性和可维护性。这部分内容探讨了如何通过代码中隐含的设计选择,传达更多的意图和信息,进而提高代码的可读性和可维护性。
2025-07-06 21:33:54
546
原创 CppCon 2018 学习:Unwinding the Stack: Exploring how C++ Exceptions work on Windows
在这段内容中,我们探讨了如何在 C++ 中通过Windows 操作系统的低级异常处理机制捕获和处理访问违规()异常。通过const_cast修改const常量:代码尝试修改一个const常量,这会导致访问违规异常,因为const数据不允许被修改。异常捕获:通常情况下,修改const常量会导致程序崩溃,但是通过 Windows 提供的低级异常处理机制,我们可以注册自定义的异常处理程序(和NT_TIB异常处理程序。
2025-07-06 21:22:15
554
原创 CppCon 2018 学习:Undefined Behavior is Not an Error
这段内容强调了未定义行为对编译器优化的深远影响以及程序员如何管理和避免 UB。编译器可能会在优化时对 UB 进行“合理”的处理,但这也可能导致一些意外的程序行为。理解 UB 是每个 C++ 程序员必须掌握的技能,避免 UB 有助于编写健壮、安全和高效的代码。这段内容深入讨论了副作用(Side Effect)和表达式顺序(Sequencing)在 C++ 中与未定义行为(UB)的关系,特别是在 C++11 和 C++17 标准中的变化。
2025-07-06 21:02:02
1027
原创 CppCon 2018 学习:TOOLS AND TECHNIQUES FOR TESTING CALLBACKS TO KILL A MOCKING FRAMEWORK
回调函数通过传递函数来控制操作,异步事件、观察者模式等都可以通过回调实现。Lambda 表达式是 C++ 中定义匿名函数的简洁方式,它通常用于回调函数中。用回调函数square_add来累计数组元素,在这里实现了一个函数式编程的例子,展示了如何通过函数的组合来表达操作。这段代码是现代 C++ 编程中函数式编程回调函数和lambda 表达式功能的经典运用,它让代码更加灵活、简洁,并能够应对多种复杂的场景。//tokenizer1是一个简单的分词器,它通过回调函数来处理每个分割出来的词元。
2025-07-06 20:51:14
896
原创 CppCon 2018 学习:These Aren‘t the COM Objects You‘re Looking For
使用RAII方法管理 COM 可以确保 COM 在正确的时机被初始化,并且在作用域结束时自动释放资源。类让你无需手动管理 COM 初始化和清理,简化了代码,也提高了安全性。这个方法可以有效避免线程上下文问题,减少内存泄漏风险,是一种非常好的实践。OLECHAR是WCHAR(宽字符类型)的别名,表示 Unicode 字符。BSTR是一个指向OLECHAR的指针,即一个指向 Unicode 字符的指针。BSTR是 COM 中专门设计的字符串类型,它包含长度前缀、数据字符串和终止符。你需要通过和。
2025-07-06 17:26:11
790
原创 CppCon 2018 学习:THE MOST VALUABLE VALUES
这个代码实现了一个基于Lager和Boost Asio的交互式计数器应用,它结合了函数式编程和响应式编程的思想,使用了不可变数据结构和单向数据流的架构。同时,它也展示了如何处理撤销和重做等调试功能,通过对历史操作的管理来实现。// 定义计数器的状态模型// 当前计数器的值,初始为0// 定义所有的操作(Action)// 增加计数操作// 减少计数操作struct reset_action { // 重置计数操作// 重置后的值。
2025-07-06 11:39:58
727
原创 CppCon 2018 学习:The C++ Execution Model
程序加载操作系统将程序加载到内存中,设置栈、堆和数据段。静态初始化全局和静态变量被初始化。静态初始化函数在main()运行之前被调用。C++ 运行时设置必要的环境,包括虚函数表(vtables)和其他内部结构。main()执行程序的入口点是main()函数。main()开始执行,并可能调用其他函数。函数执行函数被调用,调用栈管理每次函数调用的状态。局部变量被压入栈,函数退出时从栈中弹出。程序终止main()执行完后,程序开始终止过程。
2025-07-06 00:20:29
1076
原创 CppCon 2018 学习:THE BITS BETWEEN THE BITS HOW WE GET TO HOW WE GET TO main()
ELF Header (ELF 头部)ELF 文件的起始部分是 ELF Header,包含了关于文件的元数据,如文件类型、目标机器、入口点地址等信息。其主要字段包括:(魔术数字):用于标识文件为 ELF 格式。Class:标识文件类型(如 32-bit 或 64-bit)。:数据的编码方式(大端或小端)。Version:文件格式的版本。:程序的入口点地址。:指向程序头表的偏移量。:指向节头表的偏移量。Flags:与目标机器相关的标志。Size:头部的大小。
2025-07-05 23:18:02
783
原创 CppCon 2018 学习:TEACHING OLD COMPILERS NEW TRICKS TEACHING OLD COMPILERS NEW TRICKS Transpiling C++17
这个问题描述了由于编译器版本差异(特别是 GCC 4.9 与 GCC 4.8),在不同编译器版本下生成的汇编代码可能会有所不同,尤其是 C++17 中的某些新特性和语法在老版本的编译器中可能无法正确处理。虽然目前处于初期阶段,但它已经具备了强大的功能,并且随着社区的支持和开发,未来会支持更多的特性和平台。CFTF 是一个非常有用的工具,能够帮助开发者在旧版编译器上使用现代 C++ 特性,它通过将。增强的构建流程,以及它如何解决在较旧编译器上使用现代 C++ 特性的问题,特别是。代码,从而实现兼容性。
2025-07-05 19:58:47
644
原创 CppCon 2018 学习:Surprises In Object Lifetime
对象(Object):在 C++ 中,对象是任何拥有数据和类型的实体。int与struct S的区别int是一个简单的基本类型,直接保存一个整数值;而struct S是一个包含int的复合类型,它可以包含多个成员。统一初始化语法:它使得简单类型和复杂类型的初始化语法变得一致,但它们的行为仍然有差异。类型特性:断言显示了S和int都有一些相同的属性,例如可以简单地构造、析构和拷贝,它们都被认为是对象。这样解释清楚了吗?如果还有什么不明白的地方,随时告诉我!
2025-07-05 19:52:38
717
原创 CppCon 2018 学习:STATE MACHINES BATTLEFIELD NAIVE VS STL VS BOOST
“STATE MACHINES BATTLEFIELD NAIVE VS STL VS BOOST”可以理解为一种对比分析,主要是比较用不同方式实现状态机(State Machine)的优缺点。通常这是软件设计中一个经典话题,尤其在 C++ 里,状态机实现可以有多种途径,下面是一个理解框架:特点:2. STL 实现(标准库辅助)特点:特点:(功能:连接)(场景:建立连接)(场景:断开连接)…(未展开,但逻辑类似)理解:这段文字是在用BDD的Gherkin语法,描述“连接”的需求和预期行为。BDD通
2025-07-05 18:35:46
770
原创 CppCon 2018 学习:Standard Library Compatibility Guidelines (SD-8)
SD-8 是为了在持续演进 C++ 标准库的同时,不破坏旧代码的行为和编译能力。如果你是标准库开发者(如参与 libc++ 或 libstdc++),SD-8 是设计变更时必须遵循的底层兼容契约。内容解读升级代价并不小(编译错误、UB、行为变)C++ 早期有许多灰色地带和危险行为C++ 标准委员会应更明确地定义边界新标准越来越重视稳定和兼容性std关键点说明标准库允许新增名字和重载以保持向后兼容和扩展性用户代码不得在std里写代码避免和标准库新名字冲突避免未限定调用标准类型相关函数。
2025-07-05 17:01:16
1003
原创 CppCon 2018 学习:Software Vulnerabilities in C and C++
未定义行为指的是 C++ 标准没有规定程序执行结果的行为。也就是说,程序执行后可能崩溃、出现不可预测的结果,甚至看起来正常运行,但实际上任何情况都有可能发生。访问数组边界之外的内存有符号整数溢出解引用空指针在没有序列点的情况下多次修改同一个标量变量通过不同类型的指针访问对象编译器不一定会检测出未定义行为,虽然有些简单的情况会警告。编译后程序在发生未定义行为时结果不可预期,可能崩溃或出现任意行为。不要依赖或推断未定义行为的结果,应该假设它会导致程序崩溃或者永远不会被执行。
2025-07-05 16:51:58
755
原创 CppCon 2018 学习:Smart References
LargeModel使用,即用Proxy包裹数据,实现延迟加载。SmallModel使用,直接存储数据。智能指针,比如,是对原始指针Foo*的封装,自动管理对象的生命周期(比如自动释放内存)。你可以用访问对象的成员,就像用指针一样:std::shared_ptr<Foo> foo = ...;foo->bar();// 使用箭头操作符访问成员智能指针模仿指针的行为,支持指针的语义。C++ 中的引用(Foo&)是对象的别名,本身不是对象,不能重新绑定到其他对象,也不能为 null。
2025-07-05 15:06:52
794
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关注的人