C-C++
文章平均质量分 81
-飞鹤-
喜欢音乐,喜欢文学,喜欢跑步,喜欢编程!
展开
-
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 · 4680 阅读 · 0 评论 -
C/C++代码性能优化——编程实践
主要针对嵌入式C/C++,性能优化编程技巧,参数传递、函数返回、循环展开、查表、位域、尾递归、位运算、0数组、分支预测、异步计算、事件驱动架构、AI。其他性能负优化的示例。原创 2024-03-22 17:43:28 · 1273 阅读 · 0 评论 -
C/C++代码性能优化——数据结构和算法
数据结构,数组、链表、块状链表、栈、堆、队列、二叉树、红黑树、B树、B+树、跳表、索引、哈希表、图的应用场景和性能比较。 常用排序算法、查找的应用场景和性能比较,其他通用算法应用场景介绍。原创 2024-03-22 17:40:14 · 1358 阅读 · 0 评论 -
C/C++代码性能优化——编译器和CPU
在现代软件开发中,性能优化至关重要,尤其是在资源受限的系统和处理大量数据的应用程序中。C/C++ 作为低级编程语言,提供了对底层硬件的直接访问,使其成为性能关键应用程序的理想选择。然而,编写高效的 C/C++ 代码是一项具有挑战性的任务,需要对语言特性、编译器优化、硬件架构、数据结构和算法有深入的理解。本文旨在为 C/C++ 程序员提供一个全面的指南,涵盖各种优化技术,以提高代码性能,重在指南引导,不讲细节。原创 2024-03-22 17:35:48 · 2400 阅读 · 0 评论 -
C++常用知识简介
包括C++基础语法,常用的现代C++语法,算法、数据结构、编程模式。原创 2023-04-01 01:00:00 · 705 阅读 · 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 · 1866 阅读 · 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 · 2862 阅读 · 0 评论 -
C++20新语法
在C++20标准中,允许Lambda表达式使用 [=, this] 这样的语法进行捕获。这种语法称为“复合捕获”(compound capture),表示同时对this指针和所有父作用域的自动变量进行值捕获。具体来说,当我们使用 [=, this] 进行复合捕获时,Lambda表达式会自动捕获当前对象的this指针,并以值的方式复制到Lambda表达式的闭包中。与此同时,Lambda表达式还将自动捕获所有父作用域中的自动变量,并以值的方式复制到闭包中。原创 2024-01-31 19:10:37 · 1686 阅读 · 0 评论 -
C++17新语法及标准库
在C++ 17中,引入了一个新的auto规则来改进直接列表初始化(direct-list-initialization)的行为。在此前,使用auto声明变量并对其进行直接列表初始化时,结果类型通常为std::initializer_list。这意味着该变量只能表示一个具有可复制语义的对象集合,并且很难用于处理其他类型的值。在上面的示例中,我们使用了新的auto规则来声明变量并对其进行直接列表初始化。在第一个示例中,由于列表只包含单个元素,因此结果类型为int。原创 2023-06-12 18:06:59 · 7308 阅读 · 1 评论 -
c++14新增语法和标准库特性
C++14在C++11的基础上,进一步完善语法,并新增了标准库特性进一步提升C++语言的功能。原创 2023-05-09 22:14:30 · 1847 阅读 · 0 评论 -
C++11新增语法特性及标准库简介
c++11新增语法特性以及标准的全面介绍。原创 2023-04-04 23:36:49 · 2177 阅读 · 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 · 2306 阅读 · 4 评论 -
本周小贴士#135:测试约定而不是实现
作为TotW#135最初发表于2017年6月5日由James Dennett创作“如果你有一个真正的朋友,那么你拥有的不仅仅是你所拥有的”——托马斯·富勒C++有一个使用公有的,保护的,私有的和友元的详细访问控制机制。测试代码有它自己使用这些装置的规则,GoogleTest使用它的FRIEND_TEST宏来扩充它们。使用FRIEND_TEST应该是最后的手段,而不是优先选项。我们编写测试来发现组件约定实现中的错误,或者让我们有足够的信心相信这里没有此类错误。在使用测试驱动开发(TDD)时,我们还编写测试来帮翻译 2022-06-05 18:29:13 · 220 阅读 · 0 评论 -
本周小贴士#134:make_unique与私有构造函数
作为totw#134最初发表于2017年5月10日由谷歌工程师Yitzhak Mandelbaum创作因此,你阅读了小贴士#126并准备留下一些新的东西。一切都是正常的,直到你尝试使用absl::make_unique并使用私有构造函数去构造对象,但是编译失败。让我们看一下这个问题的一个具体示例,以便理解哪里出了问题。然后,我们可以讨论一些解决方案。示例:制造小部件你正在定义一个类来展示小部件。每个小部件都有一个标识符,这些标识符受某些约束。为了确保一直满足这些约束,你将Widget类的构造函数声明翻译 2022-05-30 19:29:33 · 1317 阅读 · 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 · 320 阅读 · 0 评论 -
VS2010 C++单元测试之gtest与OpenCppCoverage实践
1. 前言想减少开发过程中产生Bug,尤其是迭代开发过程中新引入的Bug。进行单元测试是一个非常的方法,可以用来减少开发过程的Bug,尤其是通过CI自动化,每次有新的修改,都进行回归测试,可以大大增强代码的鲁棒性。1.1. 单元测试单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。“单元”一般情况定义为函数(包括类中的方法),因为函数是最小的可测试代码。跨模块的测试以及集成测试,各有各的优势,需要相互结合,而不是只用一个就可以解决所有问题。代码覆盖率,用来衡量代码测试原创 2022-05-26 18:33:21 · 2879 阅读 · 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 · 2785 阅读 · 0 评论 -
本周小贴士#130:命名空间命名
作为totW#130最初发表于2017年2月17日由Titus Winters (titus@google.com)创作命名的准确性夺去了所见的唯一性——皮埃尔·勃纳尔。Google C++ Style Guide 的最早提交包含许多人仍在使用的命名空间命名指南。 粗略地说,这可以概括为“命名空间源自包路径”。 紧跟 Java 的包命名要求,这很有意义:我们希望能够唯一标识 C++ 中的符号,并且我们希望命名空间选择具有唯一性和一致性。实际上,我们并没有。 我们只是将近十年都没有意识到。名称查找翻译 2022-05-21 17:51:01 · 157 阅读 · 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 · 1973 阅读 · 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 · 973 阅读 · 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 · 2494 阅读 · 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 · 930 阅读 · 0 评论 -
本周小贴士#122: 测试固定装置,清晰度和数据流
作为totW#122最初发表于2016年8月30日由Titus Winters (titus@google.com)创作更新于2017年10月20日清晰地表达模糊不清——E.B.怀特测试代码与生产代码有何不同?一方面,测试是未经测试的:当你编写散布在多个文件中并且有数百行SetUp的意大利面条样的代码时,任何人如何确定测试确实是需要测试的内容?你的代码审查员经常不得不假设设置是有意义的,并且尽量抽查每个独立测试用例的逻辑。在这些情况下,如果某些事情发生改变,那么你的测试很可能会失败,但是很少有人知道翻译 2022-02-10 17:02:33 · 142 阅读 · 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 · 188 阅读 · 0 评论 -
C/C++开发之Windows资源释放管理
Windows的资源是有限的,用完就应该释放,否则资源用完之后,会导致资源申请的异常,导致程序运行异常。很多开发语言是基于一个"虚拟机"框架,框架会帮助语言完成相应资源的申请及释放。但是很多开发语言是直接生成可执行文件,这种开发语言的资源申请及释放必须自行完成,如C/C++等。常见的资源申请及释放有:1. 内存(Memory)此处的内存主要是指应用程序可以使用的堆内存。1.1. 常见情形● malloc之后调用free。● new之后调用delete。● new[]之后调用delete[]。原创 2021-11-17 14:19:12 · 1182 阅读 · 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 · 450 阅读 · 0 评论 -
C++随机数之线性同余发生器
1. 随机数随机数,也即“随机选择的数”,是在一个有限数集上的一个一致分布的随机序列。随机数在许多方面有应用,如仿真、抽样、数值分析、计算机程序、娱乐等方面都有所应用。计算机用确定算法计算出来的随机数系列是伪随机数,并不是真正的随机数,但是其具有随机数的统计特征,如均匀性、独立性等。在上世纪初,冯诺伊曼建议用平方,然后取结果中间的数据作为随机数(平方取中法)。结果看起来修似乎是随机的,但是很多人对此质疑。实际上这并不是好的随机方法,尤其是针对一些短循环序列。2. 线性同余序列2.1. 概念后来,有原创 2021-08-11 12:17:59 · 4342 阅读 · 0 评论 -
本周小贴士#90:退役标志
作为TotW#90最初发表于2015年3月19日由Titus Winters创作关于我们误用命令行标志的那些令人挫败的事情之一是难以安全地从二进制文件和生产服务器中删除标志(重新访问https://abseil.io/tips/45 以了解一些令人挫败的误用)。这个麻烦?如果你指定一个不再定义的标志,二进制文件不会启动,因此移除标志可能需要在C++代码和你的启动脚本和配置的任务中进行协调。在某些情况下,这种协调可能非常具有挑战性(基于二进制版本调整产品代码)。要是有更好的方法就好了!这里有。不久前,翻译 2021-07-29 21:31:38 · 225 阅读 · 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 · 357 阅读 · 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 · 155 阅读 · 0 评论 -
本周小贴士#64:原生字符串字面量
作为totw/64最初发表于2019年12月9日由Titus Winters (titus@google.com)创作更新于2017年10月23日“(?:”(?:\\"|["])*"|’(?:\\’|[’])*’)";——一只猫走过键盘…或者可能是一只狐狸说的…不是的,实际上这只是在真实C++代码中的一个高度转义的正则表达式。由于转义的问题,你可能在正确理解正则表达式上遇到麻烦。同样地,当你将Protobuf或JSON数据的文本嵌入你的程序中时,你可能对保留引号和换行符感到恼怒。当你必须使用重要的转翻译 2021-06-26 20:31:45 · 153 阅读 · 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 · 400 阅读 · 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 · 292 阅读 · 0 评论 -
C++的动态多态与静态多态
1. 概述C++是一门面向对象的编程语言。面向对象的一个最重要特征,即面向接口编程。面向接口编程,可以降低代码的耦合度,提高维护代码的可靠性。而面向接口编程是通过多态这一语言特征来实现的。2. 动态多态2.1. 概念顾名思义,动态多态,即在运行时,也即代码执行时表现出来的多种状态。在语法层面,是通过使用virtual标记基类的函数,然后在派生类中重写此函数。在代码执行时,通过基类指针或引用的真实派生类型来调用派生类中的实现。在实现层面,主要是通过虚函数表来实现的。基类有virtual函数,则有原创 2021-06-07 15:53:26 · 1520 阅读 · 0 评论 -
本周小贴士#55:名字计数与unique_ptr
作为totw#55最初发表于2013年9月12日由Titus Winters(titus@google.com)创作于2017-10-20更新“尽管我们可能以一千种名字来认识他,但是他于我们所有人而言是同一个人。”——圣雄甘地通俗来讲,值的“名字”是在任意作用域内保持特定数值的任意值类型变量(不是指针也不是引用)。(对于规范律师而言,如果我们说“名字”,实质上我们谈论的是左值。)因为std::unique_ptr的特定行为的要求,我们需要确保在std::unique_ptr中保存的任意值仅有一个名字翻译 2021-05-28 20:46:15 · 220 阅读 · 0 评论 -
本周小贴士#49:参数依赖查找
作为totw/49最初发表于2013年7月14日概要诸如func(a, b, c)这样的函数调用表达式,在这个表达式中函数没有使用::作用域操作符,这样的函数调用是不受限的。当C++代码涉及一个命名不受限的函数时,编译器将搜索一个匹配的函数声明。令人感到惊讶的(与其他语言不同)是,除了调用者词法作用域外,这搜索的作用域还会扩展到与函数参数类型相关的命名空间。这个额外的查找被称为参数依赖查找(ADL)。它肯定会发生在你的代码中,如果你对它是如何工作的,有一个基本的了解,那么你将会更好。名称查找的基础函翻译 2021-05-21 20:51:07 · 322 阅读 · 0 评论 -
本周小贴士#45:避免标志,尤其是在库代码中
作为totw#45最初发表于2013年6月3日由Titus Tinters创作"由于我的代码被全局变量控制以至于无法进行静态预测,并且这种用法无法生成完整的日志,我真正想做的只能是非常艰难地将它们从我的代码中移除“——曾经的一个未留名的人在进行生产的代码中,特别是库中,标志(flags)的通常用法是一个错误。除非确实需要,否则不要使用标志。这里,我们讲过了。标志是全局变量,更糟糕的是:你无法通过阅读代码来知道变量的值。一个标志不仅在启动时会被设置,而且随后可能被任意的方式修改。如果你运行一个二进制件翻译 2021-04-12 21:23:02 · 119 阅读 · 0 评论 -
ProtoThread原理及应用
概述1.1. 概念进程,一个具有独立功能的正在运行的程序实例。进程是相互独立的,并且可以同时运行。线程,描述一段代码的执行路径。线程属于进程,每个进程至少有一个线程。线程有自己独立的栈,多个线程可以同时运行。协程,coroutine,可以看作co-routine,也即协作程序。几个程序协作运行,可以理解为轻量级线程。1.2. 应用进程和线程都是重量级的,功能更强大,但是开销同样更大。尤其是针对一些嵌入式设备,受限于空间和性能,无法使用进程和线程。此时有一些并发需要,如果沿用通常的顺序流程来开发.原创 2021-04-02 19:07:33 · 4171 阅读 · 0 评论 -
本周小贴士#42:相较于初始化方法,优先选择工厂函数
作为totw/42最初始发表于2013年5月10日由Geoffrey Romero(gromer@google.com)创作修订于2017年12月21日“建工厂的人建了寺庙;工作在那里的人在那里敬拜,对于每个人来说,没有轻蔑和责备,只有尊敬和赞美,这是他们应得的。”——卡尔文·柯立芝(Calvin Coolidge)在不允许使用异常的环境中(例如在Google),C++构造函数实际上必须成功,因为它们不能向调用者报告失败。当然,你能够使用abourt(),但是如此做会导致整个程序崩溃,这在产品代码通翻译 2021-03-22 01:45:11 · 180 阅读 · 0 评论 -
本周小贴士#36:新的连接API
作为TotW/36最初发表于2013年3月21日由Greg Miller (jgm@google.com)创作“我非常想加入俱乐部然后用它打败你”——格劳乔·马克斯你们中的许多人想要一个新的连接API,我们听到了你们的声音。现在,我们有一个连接函数来全部替换它们,这个连接函数名为absl::StrJoin()。你只需要简单地给出一个需要连接的对象的集合和分隔字符串,然后它将完成其他的。它对于std::string,absl::string_view,int,double以及任何absl::StrCat翻译 2021-03-17 20:25:52 · 133 阅读 · 0 评论