
C++11
文章平均质量分 78
fpcc
行之苟有恒,久久自芬芳!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
c++26新功能—Read-Copy-Update
RCU(读复制更新)是一种高效的并发编程机制,适用于读多写少场景。其核心原理包括:无锁读取、副本写操作和宽限期回收旧数据。相比传统读写锁,RCU通过延迟回收内存实现非阻塞读取,提升了系统实时性。该技术已应用于Linux内核和分布式系统,C++26也将其纳入标准。示例代码对比了读写锁和RCU的实现差异,显示RCU通过原子指针和同步机制优化性能。RCU的发展体现了实际应用需求对技术演进的推动作用,是并发编程领域的重要进步。原创 2025-07-26 15:51:29 · 265 阅读 · 2 评论 -
跟我学C++中级篇——进程内存空间的管理
C/C++程序运行时内存区域可分为6个部分:代码段(只读)、全局/静态区(含.data和BSS段)、堆(动态分配)、栈(函数调用)、字符串常量区。C++新增"自由存储区"概念,通过new/delete管理对象生命周期。内存分区有助于优化资源利用、提高代码效率和安全性,需注意栈溢出、内存泄漏等问题。理解内存布局对编写高效安全代码至关重要,尤其是在并行和分布式编程中。随着标准演进,需关注分区原理而非具体实现细节,方能写出更优代码。原创 2025-07-25 07:46:24 · 871 阅读 · 2 评论 -
跟我学C++中级篇—私有的析构函数
摘要:本文探讨了C++中私有化析构函数的特殊应用场景及其局限性。析构函数私有化会阻止对象在栈空间创建和自动调用,适用于需要显式控制对象生命周期的特定情况,如全局单实例等。然而这种做法可能导致内存泄漏,并影响智能指针和继承机制的正常使用。文中提出通过友元函数或公有接口函数来释放对象资源,并强调这是特定场景下的灵活应用,非通用做法。这种技术体现了C++的灵活性,开发者需在基础与灵活应用间找到平衡。原创 2025-07-18 10:01:30 · 297 阅读 · 2 评论 -
c++26新功能—文件流中的原生句柄
C++26引入的std::os_handle通过提供跨平台文件句柄抽象,解决了不同操作系统文件操作差异带来的开发复杂度问题。该特性允许开发者在文件流操作中直接访问底层文件句柄,实现文件状态和属性的灵活控制,同时保留流式操作的便利性。其核心优势包括:RAII资源管理、跨平台兼容性、自动所有权转移和统一接口设计。通过原生句柄与文件流的互操作,既保持了高级抽象的易用性,又提供了底层操作的灵活性,有效降低了文件处理的风险和开发难度。原创 2025-07-12 09:13:38 · 382 阅读 · 0 评论 -
c++26新功能—copyable_function
C++26将引入std::copyable_function作为std::function的补充完善,主要改进包括:1)支持精确的cv限定符和noexcept规范;2)引入严格非空处理;3)移除RTTI依赖降低开销。它与std::function的主要区别在于类型安全控制和异常处理机制,但不完全替代后者。开发者应根据具体场景选择使用:新项目优先考虑std::copyable_function,需要精确限定符时必须使用它,兼容旧代码时可混用。这一演进体现了C++标准对早期功能短板的持续改进,使语言更强大易用。原创 2025-07-11 22:36:54 · 547 阅读 · 0 评论 -
跟我学C++中级篇—常见的数据类型
本文探讨了C++数据类型的发展与应用。文章首先指出数据类型是编程语言的基础,随着C++标准的演进,数据类型不断丰富,导致语言复杂度增加。接着介绍了常见数据类型分类,包括标量类型、复合类型、POD类型、标准布局类型、平凡类型和聚合类型,并分析了它们的特点和演进历程。文章强调这些类型设计是为了保持与C语言的兼容性,并支持数据通信和初始化等场景。最后通过代码示例说明类型特性,建议通过拆解分析来掌握基础知识的灵活应用。文章指出理解数据类型演进有助于把握C++标准的发展方向。原创 2025-07-06 08:53:07 · 893 阅读 · 0 评论 -
C++20中的counting_semaphore的应用
本文全面介绍了C++20中的std::counting_semaphore信号量机制。首先说明了其模板定义和binary_semaphore特例,指出LeastMaxValue是可突破的上限值。文章对比了信号量与互斥体的区别,强调信号量不绑定特定线程,允许指定数量的线程同步访问。重点解析了acquire和release两个核心接口的原子性操作及注意事项,特别提醒release超过上限会导致未定义行为。通过一个线程间通信的示例代码演示了实际用法。最后建议谨慎使用信号量,仅在特定场景下考虑采用,强调技术选择应以原创 2025-07-05 12:03:04 · 730 阅读 · 0 评论 -
跟我学C++中级篇—重载重写覆盖和隐藏
本文探讨了C++函数中的重载、重写、覆盖和隐藏等概念。重载指同一作用域内同名函数参数不同;重写是子类重新定义父类虚函数实现多态;覆盖有时与重写同义;隐藏则是父子类同名函数时子类函数遮蔽父类函数。文章通过对比分析和代码示例,阐明了这些概念的区别与应用场景,强调基础知识对编程进阶的重要性。开发者需扎实掌握这些基础概念,才能在中高级开发中突破瓶颈。原创 2025-07-05 08:58:16 · 928 阅读 · 3 评论 -
c++26新功能—几个细节的完善
C++26标准带来多项语言和库的改进,提升了灵活性和安全性。语言特性方面扩展了字符集(支持@、$等),增强constexpr转换能力,引入占位符变量"_"。库改进包括string_view互操作性、std::is_within_lifetime内存安全检查,以及新增SI前缀(如quecto、ronna等)处理物理量单位。这些优化既包含重大特性也注重细节完善,使C++在保持高效的同时更加易用。通过示例代码展示了新特性的实际应用,表明C++26在语言演进中兼顾了重要功能与细节优化。原创 2025-07-04 21:16:20 · 543 阅读 · 0 评论 -
跟我学C++中级篇—哑元的扩展应用
摘要:本文探讨了哑元(dummy)在C++编程中的扩展应用场景及其价值。主要分析了三种典型应用场景:在多态中作为测试接口的哑元子类、在泛型编程中作为模板默认参数、以及在单元测试中创建哑对象。文章指出,哑元虽简单但能优化代码逻辑、增强测试性和扩展性,其与Mock对象的区别在于功能复杂度较低。作者强调,技术不在于复杂程度,而在于恰当应用场景的选择,合理的哑元使用能达到画龙点睛的效果。开发者应重视简单技术的场景化应用价值。原创 2025-07-03 18:47:43 · 384 阅读 · 0 评论 -
跟我学C++中级篇—哑元
摘要: 哑元(Dummy Object)是编程中占位但不参与实际功能的变量或函数,类似现实中的“吉祥物”。C++中哑元常用于函数参数(保持签名一致性)、模板元编程(空类标签)或特殊标记(如[[maybe_unused]])。例如,std::monostate作为占位符,或通过空类DummyID实现模板逻辑分支。哑元虽看似无用,但在多场景兼容和接口设计中有重要作用,体现了编程中理论结合实践的思想。原创 2025-07-02 18:32:48 · 284 阅读 · 0 评论 -
c++26新功能—平凡迁移
本文介绍了C++26新标准中的"平凡迁移"(Trivially Relocatable)概念。平凡迁移允许通过类似memcpy的方式直接复制对象内存,无需调用构造函数和析构函数,从而提高内存处理效率。其核心条件是:具有平凡移动构造、平凡析构,且无虚基类,所有成员和基类都需为平凡迁移类型。与Trivially Copyable不同,平凡迁移不要求拷贝构造函数为平凡的。文章通过代码示例展示了平凡迁移类型的判断方法,并指出新标准旨在统一内存处理方式,扩展简单数据类型处理方案到复杂对象场景。该特原创 2025-06-28 09:43:46 · 285 阅读 · 1 评论 -
c++26新功能—并行库支持的扩展
文章摘要:本文探讨了并行库的核心思想与C++26对并行编程的增强。并行库通过资源分配和管理解决单核CPU性能瓶颈问题,其关键在于最大化多核协同效率。C++26扩展了std::execution功能,新增CPU核心绑定(亲和性)和任务优先级队列支持,并引入类似Kotlin的链式异步操作语法。文中展示了线程池调度和未来值链式处理的示例代码,同时指出这些特性尚未被主流编译器完全支持。作者强调学习新标准应关注方向性趋势,但生产环境应用需待编译器完全兼容后再实施。(149字)原创 2025-06-28 09:41:41 · 459 阅读 · 1 评论 -
c++26新功能—未求值字符串
摘要:未求值字符串是指在编译期处理但不生成运行时代码的字符串,主要用于元编程、编译期消息处理(如静态断言、警告信息)和反射功能。它实现了零成本抽象,仅影响编译期而不增加运行时开销,为开发者提供了更好的编译期控制。示例展示了其在静态断言、类型信息和条件编译中的应用,体现了现代C++标准对开发体验的精细优化。(149字)原创 2025-06-27 21:32:56 · 276 阅读 · 0 评论 -
c++26新功能—风险指针
本文探讨了C++多线程编程中的资源安全管理问题,重点分析了传统有锁编程和无锁编程(CAS)的优缺点。针对无锁编程中的ABA问题和资源回收难题,文章介绍了C++26标准提出的风险指针(hazard_pointer)机制,这是一种延迟内存清理的解决方案。风险指针通过线程私有列表管理和定期扫描机制处理内存回收,但目前草案尚未解决ABA问题。文中提供了风险指针的示例代码并指出其应用前景,但同时也提到该特性可能无法如期进入C++26标准。最终能否实现还需等待标准正式发布确认。原创 2025-06-22 08:47:53 · 382 阅读 · 1 评论 -
c++26新功能—饱和算术
C++26引入饱和算术(Saturation Arithmetic)解决传统整数运算溢出问题,提供add_sat、sub_sat、mul_sat、div_sat和saturate_cast等函数模板,当运算结果超出数据类型范围时会自动钳制到最大值/最小值。该特性目前主要支持整数类型,通过防止数值溢出提升代码安全性,体现了C++标准向更安全方向发展的趋势。示例代码展示了这些函数在加减乘除和类型转换时的饱和处理效果,表明C++正通过引入类似Rust的安全机制来增强语言竞争力。原创 2025-06-21 08:22:37 · 398 阅读 · 1 评论 -
c++26新功能—hive容器
《C++容器演进与std::hive的应用》探讨了技术发展与现实需求的对应关系。STL容器从基础结构逐步演进,针对游戏开发等高频读写场景,提出了std::hive容器。该容器源自plf::colony,具有O(1)复杂度、迭代器稳定(插入时)和高效内存管理三大特性,采用分块存储和skipfield机制优化性能。例程展示了其简洁用法。文章强调技术发展规律与现实问题解决思路的相通性,指出跨领域思维的重要性。原创 2025-06-21 08:15:31 · 540 阅读 · 0 评论 -
c++26新功能—结构化绑定的扩展
C++26扩展了对结构化绑定的支持,允许在if和switch语句中使用auto解构容器和对象,进一步简化代码编写。本文介绍了C++17中结构化绑定的基本应用,并重点阐述了C++26的新特性:更细粒度的控制(如属性解析)和模板可变参数解构。通过例程展示了将结构化绑定与if初始化语句结合使用的场景,强调这些看似简单的语法扩展实际上体现了C++标准演进的核心价值——在不增加学习门槛的前提下提升开发效率。文章指出,标准演进应注重实用性和易用性,而非一味追求技术复杂度。原创 2025-06-15 09:23:08 · 420 阅读 · 1 评论 -
c++26新功能—契约与概念
本文分析了C++26中的契约(Contracts)和C++20中的概念(Concepts)在代码安全控制方面的特点与协同应用。契约主要用于运行时对函数进行前置/后置条件检查,而概念则用于编译时约束模板参数。二者可分层协作:编译时使用概念,运行时使用契约;模板优先使用概念并配合契约;还可通过契约的忽略选项优化性能。通过例程展示了二者如何协同工作,概念确保类型安全,契约验证运行时条件。技术应用应注重与其他技术的互补协作,而非孤立使用,才能构建更健壮安全的C++代码。原创 2025-06-15 09:21:34 · 400 阅读 · 0 评论 -
c++26新功能—契约编程
C++26引入契约编程新特性,旨在提升代码安全性与可维护性。契约分为前置条件(pre)、后置条件(post)和断言(contract_assert)三种形式,通过四种检查语义(忽略/观察/快速强制执行/强制执行)平衡调试与性能需求。契约允许在函数声明中嵌入预期行为约束,并提供自定义违反处理接口。示例展示了如何用契约验证向量规范化操作的前后条件。这一特性标志着C++在安全性方面的系统化改进,为开发者提供了更强大的错误预防机制。契约编程的引入体现了C++持续演进的发展趋势,有助于编写更可靠的代码。原创 2025-06-14 09:47:33 · 1055 阅读 · 2 评论 -
跟我学c++中级篇——C++14中的透明操作符
本文介绍了C++14引入的透明操作符(Transparent function objects)特性。透明操作符是一种特殊函数对象,能够自动推导参数类型而无需显式指定,提高了代码简洁性和安全性。文章分析了其优势(减少编码复杂度、增强类型安全)和缺点(增加编译复杂性、应用有限性),并列举了常见透明操作符(如std::less<>)。通过实例演示了在集合操作中的应用,说明其保留了C++强类型特性同时简化了开发。透明操作符体现了C++标准向更易用方向发展的趋势,在保持类型安全的前提下优化开发体验。原创 2025-06-07 09:14:33 · 496 阅读 · 1 评论 -
跟我学c++中级篇——理解类型推导和C++不同版本的支持
C++类型推导技术演进分析 本文系统梳理了C++标准中类型推导技术的发展历程。类型推导作为强类型语言的重要特性,在C++11引入auto和decltype,14/17标准扩展了auto应用场景并引入CTAD(类模板参数推导),到C++20通过概念和约束增强了推导控制能力。文章指出,虽然推导技术不断进步,但在模板和元编程中仍显复杂。建议开发者根据实际需求选择性学习,不必过度深入。随着标准演进,编译器自动推导能力将持续提升,但完全智能化仍需时日。原创 2025-06-06 21:38:55 · 1057 阅读 · 0 评论 -
跟我学c++中级篇——隐式转换的意义
本文探讨C++中隐式转换的必要性与管控方法。隐式转换分为基础类型转换、类对象转换和wrapper转换三类,虽方便但存在安全隐患。为控制风险,建议使用static_cast等强制转换、类构造函数加explicit关键字、模板中应用SFINAE技术。通过Demo类示例展示如何禁止隐式构造转换。作者强调应在确保安全的前提下谨慎使用隐式转换,推荐优先采用显式转换方式。随着标准演进,隐式转换的使用正被逐步规范和限制。原创 2025-05-31 08:41:03 · 332 阅读 · 0 评论 -
跟我学c++中级篇——动态库的资源处理
本文探讨了动态库编程中的资源管理问题。文章指出动态库资源管理的核心在于合理分配、应用和回收各类资源,包括变量、内存、IO、CPU及其它计算机资源。重点分析了指针变量、静态变量和全局变量等特殊变量的管理风险,强调资源所有权明确和RAII原则的重要性。此外,文章还讨论了异常处理、设计模式应用及消息传递等动态库特有的资源管理挑战。最终强调掌握动态库资源管理的原理和方法对避免程序崩溃至关重要。原创 2025-05-30 22:05:12 · 1082 阅读 · 0 评论 -
跟我学c++高级篇——模板元编程之十三处理逻辑
元编程中的逻辑处理主要包括条件判断和循环处理。条件判断可通过传统方法(如三目运算符、模板特化、SFINAE技术)和C++新标准方法(如std::conditional、if constexpr、Concepts)实现。循环处理则可通过递归模拟、折叠表达式和模板技巧实现,例如递归模拟斐波那契数列的计算。掌握这些基本逻辑处理是理解和应用元编程的关键。原创 2025-05-11 10:04:43 · 542 阅读 · 4 评论 -
跟我学C++中级篇——STL中的删除对比
本文对比分析了STL中的两种删除方法:std::remove和erase。std::remove并未真正删除元素,而是将其移动到容器尾部,适用于快速删除;而erase则直接删除元素,适用于容器元素的彻底移除。两者在所属库、处理结果和适应性上存在差异,std::remove不适用于关联容器,而erase则更为通用。随着C++20标准的推出,std::erase和std::erase_if进一步简化了删除操作。通过例程展示了两种方法的使用,并指出STL的发展趋势是简化操作,鼓励学习新标准以更好地应用。原创 2025-05-10 09:55:54 · 458 阅读 · 2 评论 -
跟我学C++中级篇——STL容器的查找对比
C++标准库提供了多种查找方法,其中std::find和std::search是两种常用的查找方式。std::find用于在容器中查找单个特定值,而std::search用于在序列中查找连续的子序列。两者的主要区别在于查找对象、参数类型、时间复杂度和返回值。std::find的时间复杂度为O(N),而std::search的时间复杂度为O(M)~O((N-M+1)*M)。通过示例代码可以更直观地理解两者的应用场景和用法。对比学习这两种查找方法有助于提升编程效率和理解深度。原创 2025-05-09 22:12:53 · 536 阅读 · 0 评论 -
c++26新功能——Pack indexing
一个技术的出现也会有生命周期中的几个阶段,一般来说只有到了成熟期才会非常广泛的应用于开发者的开发过程中。毕竟大多数的开发者和其服务的公司,都不愿意承担学习和应用的风险。但如果这项技术已经被验证是一个未来,还是应该努力的从开始就跟进它,从而更好的掌握这门技术,能更好的服务于自己的开发实践!原创 2025-05-04 10:41:50 · 554 阅读 · 3 评论 -
c++26新功能——gcc15.1的支持
其实C++新标准的落地,最重要的还是看编译器的支持。即使会有一些小的惊喜,但整体上,编译器对新标准的支持需要不断的迭代才可能完成。特别是面临一些重大标准的推进,可能有较多的基础库需要更新,这就使得编译器自身的更新迭代无论从时间还是工作量上都增加不少的难度。但新的终究会来,老的终将故去。与诸君共勉!原创 2025-05-03 17:44:46 · 1555 阅读 · 2 评论 -
跟我学C++中级篇——处理对象的复制
本文可以说是对前面的一系列的相关文章的总结,如果只是看这一篇,可能有务虚的感觉。大家可以把本文做为一篇阅读的目录或大纲,逐一展开去学习或分析即可。当然,不是每个开发者对这些内容都感兴趣,大家只要根据自己情况决定即可。原创 2025-04-25 21:37:10 · 529 阅读 · 1 评论 -
跟我学C++中级篇——程序中的临时文件的处理
临时文件就是一个应用处理的中间态,一般情况下,这种中间态是不稳定的,所以临时文件往往意味着随时有可能会被清理。开发者要善于运用这种状态达到自己的一些设计目的,但千万不要在这种临时文件中一时兴起写一些重要的数据。开发者也要有一双善于发现美的眼睛!原创 2025-04-20 09:11:08 · 492 阅读 · 3 评论 -
跟我学C++中级篇——尾调优化
通过上面的分析可以发现,TCO是需要条件进行触发的。换句话说,它和inline有些类似,开发者并不能完全决定是否最终会调用TCO,而是由编译器根据情况来确定的。所以,这就给开发者一个提醒,能自己优化的就不要依赖编译器,特别是那些跨平台的开发者。只有开发者自己确定的才是真正可以确定的。依赖其它的情况都可能导致意外的发生,一定要注意!原创 2025-04-13 09:21:07 · 738 阅读 · 0 评论 -
设计心得——状态机
一定要明白状态机的目的和作用,要学会在不同的场景和条件灵活的使用状态机。一般情况下,状态机的设计不要过于复杂,这样不利用状态机的维护。同样过于简单的情况也不一定非得要用状态机。至于如何避免复杂,就记住一句话,拆分状态逻辑,利用中间层处理。状态机和其实现的方式,其实都是重点,重点在于如何将状态机与实际的实现逻辑严格的对应起来,保证状态的稳定和准确,特别是不能忽视某些特定条件的状态转换及行为的细微差异。只要能把握完整的状态流程,状态机的实现也就是一种代码的展开罢了。原创 2025-04-03 22:50:08 · 1126 阅读 · 0 评论 -
跟我学C++中级篇——In-Place Construction 和placement new
技术的进步不是一朝一夕完成的,它一定是从需求出发,不断的进行完善,然后被抽象出来。无论是RVO还是各种的内存优化,当然也包括今天提到的就地构造等,它们都是对追求效率和安全的一种演进过程。不管是开发者还是设计者,都要多学习这种优秀的经验,不断的融会贯通,提高自己的整体的水平。既要拿来主义,又要明白主义,博采众家之长,这才是学习的最终目的。原创 2025-04-03 22:47:28 · 843 阅读 · 0 评论 -
跟我学C++中级篇——std::not_fn
std::not_fn这个模板函数非常有意思,在前面我们学习过wrapper(包装器),其实它就是通过封装一个包装器来实现返回值的非。/* 未指定 */ not_fn( F&& f );(1) (C++17 起)(C++20 起为 constexpr)constexpr /* 未指定 */ not_fn() noexcept;(2) (C++26 起)这里面的f参数是一个Callable对象。原创 2025-03-21 22:49:26 · 774 阅读 · 1 评论 -
跟我学C++中级篇——void处理
老生常谈,其实就是一个原则。在合适的场景下应用合适的方法,不教条不僵化。尽量减少使用不是强制不使用,难免有各种场景下不得不用,那么就需要认真的处理即可。有隐患不是说就一定会出现,只要把握内部的机理,就不会出现问题。原创 2025-03-16 08:09:19 · 1022 阅读 · 0 评论 -
跟我学C++中级篇——定时器的设计
文章写得有点粗糙,主要是不知道如何有一个更好的切入点来分析定时器。不过也算对前面各种定时器的实现的一个笼统的概括,以后有机会再认真的综合整理一下。思考的不到位,有一种火候欠佳的感觉!原创 2025-02-28 21:01:37 · 823 阅读 · 1 评论 -
C++17中的字符转换
简单方便是一种趋势。虽然有人诟病C++现在是个大缸,啥都往里面放。但不可否认,新标准在不断的提高着语言整体的易用性,这也给开发者们一个思路,也就是常说的“简约但不简单”。原创 2025-02-15 09:33:29 · 370 阅读 · 0 评论 -
C++17中的clamp函数
AI在发展,库也在发展,会不会到最后,大家只要碎碎念一下,一个程序就出来?这种不是没有可能。但是这种可能,大概率可能需要相当长的时间。其实如果真到了那个地步,为什么还要写程序?机器人自己就搞定自己了。人类就享受一切即可。不过到那时,可能大多数人活得更不如意!原创 2025-02-14 21:33:02 · 963 阅读 · 0 评论 -
C++20中的std::atomic_ref
看到std::atomic_ref,其实就想到了智能指针,二者应用的方式何其相似。从目的上来讲就是为了让开发变得简单,特别是在多线程状态下的开发,能简单一些是一些。另外就是为了兼容更多的原有的应用让其都能使用std::atomic的功能。或者从另外一个角度看,std::atomic_ref只是一个过渡的功能,以后会出现一个更强大的类或接口,让原子操作更简单。让我们拭目以待!原创 2025-02-09 10:40:44 · 776 阅读 · 0 评论