C-C++
文章平均质量分 83
-飞鹤-
喜欢音乐,喜欢文学,喜欢跑步,喜欢编程!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
现代C++——并发编程
C++并发编程摘要 本章深入讲解现代C++中的并发编程技术,主要内容包括: 线程基础:使用std::thread创建和管理线程,支持Lambda表达式和函数对象 线程安全:通过RAII模式管理线程资源,确保异常安全 同步机制:使用互斥量(mutex)和锁(lock_guard/unique_lock)保护共享数据 高级特性:展示unique_lock的灵活锁定能力 关键点: 线程创建简单但需要谨慎管理 必须同步访问共享资源以防止数据竞争 RAII模式是管理线程和锁资源的最佳实践原创 2025-10-04 14:15:00 · 749 阅读 · 0 评论 -
现代C++——更多现代C++特性
本章深入介绍了现代C++中的关键特性,包括高效字符串视图(std::string_view)、跨平台文件系统操作(std::filesystem)、正则表达式处理(std::regex)、精确时间库(std::chrono)等核心组件。重点讲解了结构化绑定、编译时条件判断(if constexpr)、类型擦除(std::any)等提升代码表达力的新特性,以及内联变量和属性等语法改进。这些特性显著提升了C++的开发效率和代码质量,使开发者能够编写更简洁、高效且类型安全的现代C++代码。原创 2025-10-03 09:30:00 · 834 阅读 · 0 评论 -
现代C++——高级特性
摘要:现代C++高级特性精要 本章深入探讨现代C++的核心高级特性,通过丰富代码示例展示其强大功能。重点内容包括: Lambda表达式:详解6种捕获方式、mutable用法、泛型Lambda及与STL算法的配合 函数包装器:std::function的多态封装能力,可存储函数指针、Lambda和函数对象 移动语义:通过右值引用实现高效资源转移 模板编程:变参模板和模板元编程技术 类型安全容器:std::optional和std::variant的实用场景 异步编程:Future/Promise模型的基础应用原创 2025-10-02 10:45:00 · 933 阅读 · 0 评论 -
现代C++——STL容器和算法
本章深入探讨现代C++对STL的增强特性,主要包括三个核心内容: std::array:固定大小的数组容器,结合C风格数组性能与STL接口优势,支持边界检查、迭代器操作和结构化绑定(C++17),适用于固定大小数据、性能关键代码等场景。 无序容器(unordered_map/unordered_set):基于哈希表实现,提供O(1)平均复杂度的操作,支持自定义哈希函数和预分配空间优化,适合需要快速查找的场景。 emplace系列函数:允许在容器中原地构造对象,避免临时对象的创建和拷贝/移动操作,通过完美转发原创 2025-10-01 09:30:00 · 892 阅读 · 0 评论 -
现代C++——智能指针
📝 智能指针摘要 本章系统介绍了现代C++中三种核心智能指针:unique_ptr、shared_ptr和weak_ptr。unique_ptr提供独占所有权,轻量高效,适合单一所有者场景;shared_ptr通过引用计数实现共享所有权,但需注意循环引用问题;weak_ptr作为弱引用可安全解决循环依赖。智能指针基于RAII原则,自动管理资源生命周期,确保异常安全,是现代C++内存管理的首选方案。关键要点包括:优先使用make_unique/make_shared创建指针,理解所有权语义,合理选择指针类型原创 2025-09-30 09:00:00 · 652 阅读 · 0 评论 -
现代C++——基础语法
现代C++基础语法增强摘要 本章系统介绍了C++11及后续版本的核心语法增强特性,包括: auto类型推导:简化变量声明,提高代码可读性 范围for循环:提供简洁的容器遍历语法 统一初始化:使用{}实现类型安全的初始化 nullptr:类型安全的空指针替代NULL 右值引用:支持移动语义提升性能 constexpr:实现编译时计算优化 static_assert:编译时条件检查 decltype:表达式类型推导 委托构造:简化类构造函数设计 =default/=delete:控制特殊成员函数生成 这些特性使原创 2025-09-29 17:11:53 · 1095 阅读 · 0 评论 -
Visual Studio调试C/C++指南
前言Visual Studio(VS)是微软开发的一款集成开发环境(IDE)软件,支持C/C++、C#、VB、Python等开发语言,开发桌面、Web等应用程序。VS功能极其强大,使用极其便利,用户数量最多,被誉为"宇宙第一IDE"。熟悉地掌握基于VS的C/C++调试技术,可以大幅提升调试性能。随着VS版本的更新,其功能越来越强大,本文的内容是基于VS2019进行验证测试的,之前版本VS可能有少量特性不支持。基础。原创 2024-04-18 13:24:13 · 8348 阅读 · 0 评论 -
C/C++代码性能优化——编程实践
主要针对嵌入式C/C++,性能优化编程技巧,参数传递、函数返回、循环展开、查表、位域、尾递归、位运算、0数组、分支预测、异步计算、事件驱动架构、AI。其他性能负优化的示例。原创 2024-03-22 17:43:28 · 1893 阅读 · 0 评论 -
C/C++代码性能优化——数据结构和算法
数据结构,数组、链表、块状链表、栈、堆、队列、二叉树、红黑树、B树、B+树、跳表、索引、哈希表、图的应用场景和性能比较。 常用排序算法、查找的应用场景和性能比较,其他通用算法应用场景介绍。原创 2024-03-22 17:40:14 · 2099 阅读 · 0 评论 -
C/C++代码性能优化——编译器和CPU
在现代软件开发中,性能优化至关重要,尤其是在资源受限的系统和处理大量数据的应用程序中。C/C++ 作为低级编程语言,提供了对底层硬件的直接访问,使其成为性能关键应用程序的理想选择。然而,编写高效的 C/C++ 代码是一项具有挑战性的任务,需要对语言特性、编译器优化、硬件架构、数据结构和算法有深入的理解。本文旨在为 C/C++ 程序员提供一个全面的指南,涵盖各种优化技术,以提高代码性能,重在指南引导,不讲细节。原创 2024-03-22 17:35:48 · 4193 阅读 · 0 评论 -
C++常用知识简介
包括C++基础语法,常用的现代C++语法,算法、数据结构、编程模式。原创 2023-04-01 01:00:00 · 926 阅读 · 0 评论 -
GCC工具链简介
想编译各种嵌入式裸机的,想编译Linux Kernel,又或者想编译u-boot的,或者想编译运行在KylinOS上,甚至想编译运行在Android上的C代码,该选择哪个gcc版本呢?MinGW和gcc什么关系?ARM下几种gcc有什么区别?RISC-V内核又该如何选择GCC工具链呢?gcc不同版本的头文件、动态库等兼容性如何呢?选择了正确的gcc版本,又是如何编译安装呢?下载arm gcc时,经常会遇到Linaro,那么Linaro与arm、gcc是什么关系呢?gdb-multiarch?原创 2024-02-26 17:49:55 · 3175 阅读 · 0 评论 -
QEMU开发入门
QEMU开发,对于分析Linux内核帮助非常多。目前电脑上的手机模拟器、还有各种虚拟机技术也基本都是基于qemu进行扩展开发的。文章得比较详细,并提供包括固件和qemu的完整测试代码:1. Windows、Linux下的编译、安装qemu。2. 基于qemu,用VSCode单步调试单片机系统的Cortex-m、RISC-V固件代码。3. 基于qemu,用VSCode单步调试Linux Kernel代码。4. 扩展qemu,给RISC-V添加了一个自定义的uart设备,并演示如何在固件中使用这个uart来输出原创 2024-02-23 18:55:33 · 4281 阅读 · 0 评论 -
C++20新语法
在C++20标准中,允许Lambda表达式使用 [=, this] 这样的语法进行捕获。这种语法称为“复合捕获”(compound capture),表示同时对this指针和所有父作用域的自动变量进行值捕获。具体来说,当我们使用 [=, this] 进行复合捕获时,Lambda表达式会自动捕获当前对象的this指针,并以值的方式复制到Lambda表达式的闭包中。与此同时,Lambda表达式还将自动捕获所有父作用域中的自动变量,并以值的方式复制到闭包中。原创 2024-01-31 19:10:37 · 2476 阅读 · 0 评论 -
C++17新语法及标准库
在C++ 17中,引入了一个新的auto规则来改进直接列表初始化(direct-list-initialization)的行为。在此前,使用auto声明变量并对其进行直接列表初始化时,结果类型通常为std::initializer_list。这意味着该变量只能表示一个具有可复制语义的对象集合,并且很难用于处理其他类型的值。在上面的示例中,我们使用了新的auto规则来声明变量并对其进行直接列表初始化。在第一个示例中,由于列表只包含单个元素,因此结果类型为int。原创 2023-06-12 18:06:59 · 8351 阅读 · 1 评论 -
c++14新增语法和标准库特性
C++14在C++11的基础上,进一步完善语法,并新增了标准库特性进一步提升C++语言的功能。原创 2023-05-09 22:14:30 · 2595 阅读 · 0 评论 -
C++11新增语法特性及标准库简介
c++11新增语法特性以及标准的全面介绍。原创 2023-04-04 23:36:49 · 2537 阅读 · 1 评论 -
C++的编译与链接简介
内核主要是用来执行指令集的,指令集有很多,早期intel发明的x86指令集,32位地址总线,有哪此寄存器,有哪些汇编指令,如何加载执行可执行文件。后来AMD在x86的基础上扩展支持了64指令,这种新的架构也被称为x86-64,有时也会简称x64或AMD64。x64兼容32位,也即x64有两套指令集。x86,x64是intel和AMD共享专利的指令集,也即这两家的通用CPU指令集是一样的。指令集有很多,还有ARM公司的ARM指令集,还有开源的MIPS指令集。原创 2023-03-30 13:36:26 · 2517 阅读 · 4 评论 -
本周小贴士#135:测试约定而不是实现
作为TotW#135最初发表于2017年6月5日由James Dennett创作“如果你有一个真正的朋友,那么你拥有的不仅仅是你所拥有的”——托马斯·富勒C++有一个使用公有的,保护的,私有的和友元的详细访问控制机制。测试代码有它自己使用这些装置的规则,GoogleTest使用它的FRIEND_TEST宏来扩充它们。使用FRIEND_TEST应该是最后的手段,而不是优先选项。我们编写测试来发现组件约定实现中的错误,或者让我们有足够的信心相信这里没有此类错误。在使用测试驱动开发(TDD)时,我们还编写测试来帮翻译 2022-06-05 18:29:13 · 292 阅读 · 0 评论 -
本周小贴士#134:make_unique与私有构造函数
作为totw#134最初发表于2017年5月10日由谷歌工程师Yitzhak Mandelbaum创作因此,你阅读了小贴士#126并准备留下一些新的东西。一切都是正常的,直到你尝试使用absl::make_unique并使用私有构造函数去构造对象,但是编译失败。让我们看一下这个问题的一个具体示例,以便理解哪里出了问题。然后,我们可以讨论一些解决方案。示例:制造小部件你正在定义一个类来展示小部件。每个小部件都有一个标识符,这些标识符受某些约束。为了确保一直满足这些约束,你将Widget类的构造函数声明翻译 2022-05-30 19:29:33 · 1605 阅读 · 0 评论 -
本周小贴士131:特殊成员函数和`= default`
作为totw#131最初发表于2017年3月24日由James Dennett (jdennett@google.com)创作从一开始,C++ 就支持一些所谓的特殊成员函数的编译器声明版本:默认构造函数、析构函数、复制构造函数和复制赋值运算符。 C++11 向列表添加了移动构造和移动赋值,并添加了语法(=default 和 =delete)以控制何时声明和定义这些默认值。=default 有什么作用,我们为什么要使用它?写 =default 是我们告诉编译器“你通常会为这个特殊成员函数做的事情”的方翻译 2022-05-28 18:42:59 · 395 阅读 · 0 评论 -
VS2010 C++单元测试之gtest与OpenCppCoverage实践
1. 前言想减少开发过程中产生Bug,尤其是迭代开发过程中新引入的Bug。进行单元测试是一个非常的方法,可以用来减少开发过程的Bug,尤其是通过CI自动化,每次有新的修改,都进行回归测试,可以大大增强代码的鲁棒性。1.1. 单元测试单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。“单元”一般情况定义为函数(包括类中的方法),因为函数是最小的可测试代码。跨模块的测试以及集成测试,各有各的优势,需要相互结合,而不是只用一个就可以解决所有问题。代码覆盖率,用来衡量代码测试原创 2022-05-26 18:33:21 · 3258 阅读 · 4 评论 -
C/C++中如何判断浮点类型相等?
1. 浮点类型在计算中的存储格式1.1. 小数的科学计数法科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10,a不为分数形式,n为整数),这种记数法叫做科学记数法。例如:19971400000000=1.99714×10^13。计算器或电脑表达10的幂是一般是用E或e,也就是1.99714E13=19971400000000。1.2. 计算机中小数的存储格式计算机中小数的存储格式依据IEEE 745标准制定,其有三种精度标准。分别为单精度、双精度以及扩展精度原创 2022-05-23 18:39:50 · 3046 阅读 · 0 评论 -
本周小贴士#130:命名空间命名
作为totW#130最初发表于2017年2月17日由Titus Winters (titus@google.com)创作命名的准确性夺去了所见的唯一性——皮埃尔·勃纳尔。Google C++ Style Guide 的最早提交包含许多人仍在使用的命名空间命名指南。 粗略地说,这可以概括为“命名空间源自包路径”。 紧跟 Java 的包命名要求,这很有意义:我们希望能够唯一标识 C++ 中的符号,并且我们希望命名空间选择具有唯一性和一致性。实际上,我们并没有。 我们只是将近十年都没有意识到。名称查找翻译 2022-05-21 17:51:01 · 220 阅读 · 0 评论 -
基于.NET的托管C++开发
1. 简介随着Windows的发展,基于.Net的功能越来越多,使用也越来越方便。早期的.Net主要是C#和VB.NET进行开发。Windows希望几种主要的语言都能够统一,大家互相调用。Windows提供了CLR(Common Language Runtime),来统一各语言编译后的标准。另外还提供了.Net库,包括非常多的相关.Dll,提供功能API供调用。2. 托管C++基本语法托管,意味着内存的申请释放都统一交给CLR来处理。所以托管C++扩展了标准C++,提供了托管类。.NET中,所有类型都原创 2022-05-20 12:02:57 · 2252 阅读 · 0 评论 -
Windows下命令行编译MFC工程
1. makefile方式Visual Studio自带有nmake,也可以解析makefile文件,但是功能较弱,此处使用gcc自带的make解析工具。1.1. 配置编译环境call “C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat”1.2. 建立测试工程新建mfc的对话框工程,名字默认即可。1.3. 建立makefile文件SRC_DIR=.OBJ_DIR=debugCPP_SRC=$(wildc原创 2022-05-11 19:56:51 · 1224 阅读 · 0 评论 -
C/C++和Lua混合编程
1. 概述发布一款应用程序比较耗时,尤其是手机游戏应用还需要各种审查。一种简单方便的热更新,可以满足上述需求。静态编程语言生成框架,动态语言完成其他逻辑,这样可以达到热更新。lua由于其性能及简洁,是许多项目热更新时选择的动态开发语言。此文主要讲解C/C++和Lua的混合编程,主要针对Lua5.2及之后的版本(之前的版本接口略有调整)。2. 编译Lua代码2.1. Linux下编译直接在指定目录执行以下命令即可完成编译,会生成liblua.a(静态库),lua(解释器),luac(编译器)。2.2原创 2022-05-09 19:04:31 · 2906 阅读 · 0 评论 -
本周小贴士#126: ‘make_unique‘是新的‘new‘
作为totW#126最初发表于2016年12月12日由James Dennett (jdennett@google.com)基于Titus Winters (titus@google.com)的邮件列表创作随着代码库的扩展,越来越难以了解你依赖的每件事的细节。需要深入的知识无法扩展:我们必须依靠接口和契约来知道代码是正确的,无论是在写还是审查时。在许多情况下,类型系统可以用一种通用的方式来提供这些契约。类型系统契约使用的一致性,通过识别在堆上分配的对象存在潜在风险分配或所有权转移的位置,可以更轻松地编写翻译 2022-04-25 20:40:47 · 1088 阅读 · 0 评论 -
本周小贴士#122: 测试固定装置,清晰度和数据流
作为totW#122最初发表于2016年8月30日由Titus Winters (titus@google.com)创作更新于2017年10月20日清晰地表达模糊不清——E.B.怀特测试代码与生产代码有何不同?一方面,测试是未经测试的:当你编写散布在多个文件中并且有数百行SetUp的意大利面条样的代码时,任何人如何确定测试确实是需要测试的内容?你的代码审查员经常不得不假设设置是有意义的,并且尽量抽查每个独立测试用例的逻辑。在这些情况下,如果某些事情发生改变,那么你的测试很可能会失败,但是很少有人知道翻译 2022-02-10 17:02:33 · 194 阅读 · 0 评论 -
本周小贴士#120:返回值是不可触碰的
作为TotW#120最初发于2012年8月16日由Samuel Benzaquen, (sbenza@google.com)创作假设你有如下代码片段,它依赖于RAII清理函数,似乎如同预期那样生效:MyStatus DoSomething() { MyStatus status; auto log_on_error = RunWhenOutOfScope([&status] { if (!status.ok()) LOG(ERROR) << status; })翻译 2022-01-31 23:02:56 · 252 阅读 · 0 评论 -
C/C++开发之Windows资源释放管理
Windows的资源是有限的,用完就应该释放,否则资源用完之后,会导致资源申请的异常,导致程序运行异常。很多开发语言是基于一个"虚拟机"框架,框架会帮助语言完成相应资源的申请及释放。但是很多开发语言是直接生成可执行文件,这种开发语言的资源申请及释放必须自行完成,如C/C++等。常见的资源申请及释放有:1. 内存(Memory)此处的内存主要是指应用程序可以使用的堆内存。1.1. 常见情形● malloc之后调用free。● new之后调用delete。● new[]之后调用delete[]。原创 2021-11-17 14:19:12 · 1323 阅读 · 0 评论 -
本周小贴士#108:避免std::bind
作为TotW#108最初发表于2016年1月7日由Roman Perepelitsa创作更新于2020年8月19日避免std::bind本贴士总结了在编写代码时为什么要远离std::bind的原因。正确使用std::bind很难。让我们看几个例子。对你而言,这代码好看吗?void DoStuffAsync(std::function<void(absl::Status)> cb);class MyClass { void Start() { DoStuffAsync(翻译 2021-10-04 17:22:55 · 597 阅读 · 0 评论 -
C++随机数之线性同余发生器
1. 随机数随机数,也即“随机选择的数”,是在一个有限数集上的一个一致分布的随机序列。随机数在许多方面有应用,如仿真、抽样、数值分析、计算机程序、娱乐等方面都有所应用。计算机用确定算法计算出来的随机数系列是伪随机数,并不是真正的随机数,但是其具有随机数的统计特征,如均匀性、独立性等。在上世纪初,冯诺伊曼建议用平方,然后取结果中间的数据作为随机数(平方取中法)。结果看起来修似乎是随机的,但是很多人对此质疑。实际上这并不是好的随机方法,尤其是针对一些短循环序列。2. 线性同余序列2.1. 概念后来,有原创 2021-08-11 12:17:59 · 4874 阅读 · 0 评论 -
本周小贴士#90:退役标志
作为TotW#90最初发表于2015年3月19日由Titus Winters创作关于我们误用命令行标志的那些令人挫败的事情之一是难以安全地从二进制文件和生产服务器中删除标志(重新访问https://abseil.io/tips/45 以了解一些令人挫败的误用)。这个麻烦?如果你指定一个不再定义的标志,二进制文件不会启动,因此移除标志可能需要在C++代码和你的启动脚本和配置的任务中进行协调。在某些情况下,这种协调可能非常具有挑战性(基于二进制版本调整产品代码)。要是有更好的方法就好了!这里有。不久前,翻译 2021-07-29 21:31:38 · 294 阅读 · 0 评论 -
本周小贴士#88:初始化:=,()和{}
作为TotW#88最初发表于2015年6月27日由Titus Winters (titus@google.com)创作,代表Google C++风格仲裁者C++11提供了一种称为“统一初始化语法”的新语法,它被认为统一所有不同风格的初始化,避免最烦人的解析,并避免窄化转换。这种新机制意味着我们现在有另一种初始化语法,它有自己的权衡。C++11括号初始化一些统一初始化语法的支持者会建议我们使用{}和直接初始化(不使用‘=’,尽管在多数情况下两种形式调用相同的构造函数)来初始化所有类型:int x{2翻译 2021-07-27 21:59:07 · 439 阅读 · 0 评论 -
本周小贴士#86:带类的枚举
作为totw/86最初发表于2015年1月5日由Bradley White (bww@google.com)创作“显示类,…并显示字符。”——贝尔.布莱恩特enumeration,简称enum,是一种可以容纳一组指定整数中的一个类型。此集合中的某些值可以命名,它们被称为枚举值。无作用域枚举C++程序员很熟悉这个概念,但在C++11之前,枚举有两个重大的缺陷:枚举的名称:在与枚举类型相同的作用域内,然后隐式转换为某种整形值。因此,使用C++98…enum CursorDirection {翻译 2021-07-21 21:32:06 · 225 阅读 · 0 评论 -
本周小贴士#64:原生字符串字面量
作为totw/64最初发表于2019年12月9日由Titus Winters (titus@google.com)创作更新于2017年10月23日“(?:”(?:\\"|["])*"|’(?:\\’|[’])*’)";——一只猫走过键盘…或者可能是一只狐狸说的…不是的,实际上这只是在真实C++代码中的一个高度转义的正则表达式。由于转义的问题,你可能在正确理解正则表达式上遇到麻烦。同样地,当你将Protobuf或JSON数据的文本嵌入你的程序中时,你可能对保留引号和换行符感到恼怒。当你必须使用重要的转翻译 2021-06-26 20:31:45 · 215 阅读 · 0 评论 -
本周小贴士#61:默认的成员初始化器
作为Totw#61最初始发表于2013年11月12日由Michael Chastain(mec.desktop@gmail.com)创作更新于2016年10月声明默认成员初始化默认的成员初始化器在构造函数之前为成员声明默认值,如下所示:class Client { private: int chunks_in_flight_ = 0;};默认初始化器会传播到该类的所有的构造函数,甚至C++合成的构造函数。用这种方式初始化有许多数据成员的类是非常有用的,尤其是像bool、int、doub翻译 2021-06-21 21:02:09 · 544 阅读 · 0 评论 -
本周小贴士#59:连接元组
作为totw/59最初始发表于2013年10月21日由Greg Miller(jgm@google.com)创作更新于2018年1月4日“现在合起你的双手,然后和你的心在一起.”——亨利六世,威廉.莎士比亚在2013年3月,我们宣布了在贴士#36中的新的字符串连接API。针对新的API的反馈是相当积极的,接着我们着手工作让这个API变得更好。特性需要列表中优先项是能够连接任意可能不一致的数据列表(我仅能假设莎士比亚所指的是连接手和心的不同集合)。我们不能使用可变参数或可变参数模板,但是我们的确支持连翻译 2021-06-19 18:18:45 · 360 阅读 · 0 评论 -
C++的动态多态与静态多态
1. 概述C++是一门面向对象的编程语言。面向对象的一个最重要特征,即面向接口编程。面向接口编程,可以降低代码的耦合度,提高维护代码的可靠性。而面向接口编程是通过多态这一语言特征来实现的。2. 动态多态2.1. 概念顾名思义,动态多态,即在运行时,也即代码执行时表现出来的多种状态。在语法层面,是通过使用virtual标记基类的函数,然后在派生类中重写此函数。在代码执行时,通过基类指针或引用的真实派生类型来调用派生类中的实现。在实现层面,主要是通过虚函数表来实现的。基类有virtual函数,则有原创 2021-06-07 15:53:26 · 1840 阅读 · 0 评论
分享