- 博客(84)
- 资源 (4)
- 收藏
- 关注
原创 C++ 新标准——Lambda
话又说回来了,按引用捕获不是不能使用,而是应该在符合引用的场景下使用。C++ 标准关于纯右值的规定:A prvalue (“pure” rvalue) 是一种表达式,其中一种求值过程为:初始化一个对象,这种纯右值被称为拥有结果对象,这个结果可以是变量、临时对象。按引用默认捕获会导致空悬指针问题。这是因为当采用按引用默认捕获时,闭包内会包含局部变量、形参的引用,当闭包越过它们的生命周期时,闭包内引用就会空空悬。所以解决闭包引用悬空的方式是:采用按值捕获,这样捕获的变量会复制一份,不会出现悬空指针。
2026-03-04 22:03:42
280
原创 Effective Modern C++ 条款25
在按值返回的函数中,如果返回的是绑定到右值引用或万能引用的对象(即通过引用访问的对象),那么在返回这个对象时,应该对其实施 std::move 或 std::forward。std::move(w) 产生 w 的右值引用,导致 return 语句返回的是一个表达式而非局部变量本身,因此不满足 RVO 的条件。针对右值引用的最后一次使用实施std::move, 针对右值引用的最后一次使用实施std::forward;std::move 为右值引用而生,std::forward 为万能引用而生。
2026-03-03 16:21:13
552
原创 C++ 智能指针—— shared_ptr 和 weak_ptr 的关系
当 shared_ptr 析构时,控制块的 _Uses 计数减 1,当 _Uses 计数为 0 时,资源被销毁、同时控制块的 _Weaks 计数减 1,当 _Weaks 计数为 0 时,控制块被销毁。所以这就是强引用计数和弱引用计数的区别:强引用计数控制资源的声明周期、弱引用计数控制控制块的声明周期。shared_ptr 的析构函数触发控制块的强引用计数递减,当 _Uses 减为0时,释放资源并且触发控制块的弱引用计数递减,如果 _Weaks 大于 0 说明还有 weak_ptr 关联;
2026-03-02 22:51:11
323
原创 openvela——动态管理日志输出通道及其实现原理
在中提到 vela 日志输出支持多通道日志输出,它们是在系统运行前期配置好的,所以无法将它们动态删除。但是可以控制使能、禁用某通道,达到相应通道输出、不输出日志的目的。接下来篇章将讲述”动态管理日志输出通道方法“和”动态管理日志输出通道原理“。
2025-12-12 20:30:00
328
1
原创 openVela——rpmsg log 实现原理
Vela log 模块支持多通道输出,即同一日志可以分别输出到不同地方(如:uart、ram、file、rpmsg endpoint……)。只要配置了 rpmsg log 通道,就可以将日志跨核传输,整个过程是:coreA 写日志、coreA 格式化日志、coreA 使用 rpmsg 发送格式化结果、跨核传输日志、coreB 接收到对方传来的日志、coreB 将日志写入已配置的各输出通道。可以看出,写日志的一方(coreA)决定要不要跨核传输日志,日志最后在哪些地方输出由读日志的一方(coreB)决定。
2025-12-11 11:59:01
956
原创 Linux 内核——字符设备驱动框架详解
char_dev.c 源文件中定义了一个存储 cdev 的名为 cdev_map 的表,当cdev_add() 被调用时, 函数体调用 kobj_map() 把 cdev 对象添加到其中。每打开一个文件,就在该数组中放入这个文件对应的文件对象的指针(struct file*),并且返回数组的下标。应用层调用库函数 open() 会触发软中断,进入内核空间调用 sys_open(), 然后调用 vfs_open(),最后驱动层 drv_open() 被调用。,如下代码片段这个表本质是一个数组,其下标就是。
2025-11-05 21:56:04
937
原创 基于 Qemu 的内核模块开发初体验
在介绍了基于 qemu 的内核(驱动)开发环境的搭建方法,现在基于它来开发第一个内核模块并简单介绍模块开发的基本框架。
2025-11-02 14:16:06
362
原创 C++新标准—— 可变参数模板实现递归继承(tuple 实现原理)
C++ Variadic Templates 应用在 STL 的方方面面,可变参数的函数模板、类模板的核心工作机制是参数包的展开。C++17 之前通过递归的形式展开参数包,递归过程就是:将 N个元素的参数包分离第一个出来,将剩余的 N-1 个元素作为第2包,按照第1包过程继续分离第2包的一个元素,剩下 N-2 个元素作为第3包继续分离……这样不断重复下去,结果就是分离出最后一个且剩下一个空包,整个包就完全展开了。以上就是 tuple 的核心机制,应该讲的比较细致,如有错误欢迎指正。
2025-10-23 23:04:56
294
原创 Ubuntu22.04 中搭建基于 Qemu 的内核(驱动)开发环境
跳转下载交叉编译工具压缩包:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz。busybox 下载地址是 https://www.kernel.org/pub/ ,选择下载 busybox-1.32.0.tar.bz2。内核源码下载地址是 https://www.kernel.org/pub/ ,选择下载 linux-4.4.232.tar.xz。这里采用 从 Qemu 模拟的SD卡启动系统。编译过程特别耗时,建议用使用在线安装。
2025-10-22 22:59:01
550
原创 C++ STL——allocator
C++ 标准模板库提供了一个非常重要的内存管理机制——allocator。它对内存管理接口进行了封装,实现了对象内存分配与构造分离、对象析构与内存释放分离。标准库中通过模板参数为容器提供内存管理策略,allocator 就是一种具体的策略,我们可以实现基于共享内存、内存池的 自定义 allocator 把它们应用于容器。本文章将以 MSVC 的 allocator 框架为参考,讲述 allocator 的核心工作原理。
2025-10-22 09:44:14
557
原创 C++新标准——decltype 关键字
是 C++11 新增的一个关键字,它和 auto 一样,都用来在进行类型推导。它不需要对表达求职即可获得表达式类型。检查实体的声明类型或表达式的类型和值类别。实际应用这些场景:标记符的类型推导函数模板的返回值类型推导Lambda 表达式中 auto&& 类型的形参类型推导函数模板的函数参数的类型推导等。一、语法如果实参是或未加括号的类成员访问表达式,则decltype 产生该表达式所命名实体的类型。若不存在此实体,或实参指代一组重载函数,则程序非良构(编译出错)。
2025-10-07 22:25:48
408
翻译 C++新标准—— Value categories
【译】a + b, a % b, a & b, a << b 以及所有其他内置算术表达式。【译】a < b, a == b, a >= b 以及所有其他内置比较表达式。
2025-10-06 21:45:43
84
原创 C++ 类型推导(第三部分)
也就是说当传递给 std::forward 左值时返回一个左值引用,根据定义左值引用是左值;当传递给 std::forward 右值时返回一个右值引用,函数返回的右值是定义为右值的。,但是因为它涉及“万能引用”、“引用折叠”等概念,所以当时先略过,现在储备了这些知识也算是完万事具备了,所以现在探讨这种形式的类型推导。如果任一引用为左值引用,则结果为左值引用。只有两个都是右值引用,结果才是右值引用。C++ 中不允许定义显示定义“引用的引用”,但是在。过程中出现“引用的引用”是允许的。这种信息添加规则决定。
2025-09-27 22:11:03
386
2
原创 C++ 类型推导(第二部分)
继续讨论 C++ 类型推导—— auto 类型推导。auto 变量定义过程中的类型推导可以分为两种:一种是花括号形式的初始化语句中auto类型推导、另一种是普通形式的初始化语句中auto类型推导。
2025-09-27 12:58:49
262
原创 C++ 类型推导(第一部分)
在调用模板(函数)的时候,编译器会根据实参类型推导模板参数类型和函数参数类型,从而实例化出对应的函数。通常模板参数类型的推导结果与函数参数类型的推导结果不一样,这是因为函数参数类型会有诸如 const、reference、volatile 等修饰符。模板参数类型的推导结果不仅取决于实参类型还依赖函数参数类型的形式
2025-09-13 23:04:39
497
2
原创 C++ 容器——unordered_xxx
自 C++11 开始,STL 引入了基于 hash table 的 unordered_set、unordered_map 等容器,正如其名它们是无序容器。哈希函数是这些容器的核心,也是保证它们高性能的关键。
2025-09-07 23:08:59
667
原创 C++ 容器——vector
vector是表示可以改变大小的数组的序列容器。就像数组一样,vector 使用连续的内存存储元素,这意味着它们的元素也可以使用常量指向其元素的“下标”来访问。但与数组不同,它们的大小可以动态变化,其存储由容器自动处理。
2025-08-24 20:08:13
250
原创 C++ 可变参数模板(Variadic Templates)
main 函数中用参数 1, 56.8f, 'y', "hello" 调用 print 函数会匹配到 template<class T, class... Types> void print(const T &arg, const T& ... args), 第一个实参1会传给 arg,剩余的参数传给args,然后递归调用函数模板print,这时参数包的第一(56.8f)又会传给 arg,剩余的参数传给args,这样逐步取第一个,直到取完为止。C++11 新标准提出。
2025-08-24 19:21:12
214
原创 C++ STL 组件 —— 迭代器
包含 forward_iterator_tag、bidirectional_iterator_tag、 random_access_iterator_tag类型;类型的对象来访问容器(如下例1、2);另外C++标准库算法(Algorithm)等都需要借助迭代器访问容器(如下例3)。目前对迭代器的基本特点有一个认识,后续通过实现容器对迭代器进行深入了解。类型应保证足以存放同一数组中两个指针之间的差距, 有可能是负数;C++ 容器类都定义了名为。
2024-02-16 12:38:30
653
原创 C++ 基础——类模板特化
上述的模板特化对STL的迭代器很重要,之后章节将详述它们。二、 类模板特化(Specialization)一、typename 关键字的作用。
2024-02-10 22:34:40
649
原创 C++运算符重载——成员访问运算符(->)
重载成员访问运算符(函数)必须返回类对象指针或自定义了"箭头"运算符的类的对象。一、重载成员访问运算符(->)或者重载了"箭头"运算符的类的。的表达式,则obj是一个。
2024-02-09 19:32:56
814
原创 Qt —— 细说自定义Tree View Model
Tree view与Tree Widget 相比而言,需要为tree view 设置一个model。使用tree view 能有效降低内存的使用率。但是需要自定义model。下面参考Qt官方提供的demo,讨论如何自定义Tree View Model。依据名为simple tree model官方demo可知道:要自定义tree view model需要定义一个树形结构的底层数据结构,该类型结...
2020-01-20 15:54:25
5042
4
原创 C++11之保持字符串的字面意思
c/c++ Java等语言中,反斜杠(\)用于与其他字符组成特殊含义字符(如:\n是换行)。有时想表示其字面意思,比如Windows下路径分割符,在代码里要写成\\ ,显得比较麻烦。在c++11之后提供了一个简单方法:R"()"。用法为:QFile file(R"(C:\Users\admin\Desktop\default.txt)");。...
2020-01-20 11:31:23
429
原创 基本排序——快速排序(Python语言描述)
一、快速排序原理按从小到大快速排序:在数组中随机选一个数(通常为第一个),数组中小于等于此数的放在它左边,大于此数的放在右边,这样将数组一分为二。再对两边数组递归调用快速排序,直到都有序为止。#!usr/bin/python3def quickSort(arrlist): length = len(arrlist) _quickSort(arrlist, 0, len...
2019-06-15 00:35:13
381
原创 c++11新特性——移动操作
c++11新引入的这个特性实在是太棒了。因为它避免了对象创建过程中的内存分配问题,所以使代码执行的高效率更高。本文讨论对象移动操作的注意事项。一个c++类要想支持移动操作必须满足如下条件:move之后的原对象必须处于刚初始化的状态(关于初始化与赋值的概念请查阅《effective c++》对于理解这个条件很重要)。 销毁移动后的对象必须是安全的(比如:不可出现释放正在使用的资源)下面代...
2019-06-14 11:23:31
1016
1
原创 查找——二分法查找(Java语言描述)
二分法查找最基本的要求是数据序列必须升序。定位中间位置并获取到位于该位置的元素值,通过比较中间值与被查找值的大小来重新定义查找范围(beigin~mid 或 mid+1~end)。不断重复之前的操作。直到查到或范围缩小到0。package yao.sort;import org.junit.Test;public class HalfFind { public static voi...
2019-06-13 19:36:07
251
原创 平衡二叉树——旋转与插入(Java 语言描述)
对平衡二叉树的研究,大概已有半年之久。最近才算是对它有所领悟。因为网上好多博文对其讲解的都很好,在此就不再详述,只对其进行分篇章总结。一、左旋转在网上找到一左转GIF示意图。我借用一下:在不平衡子树的右子树的右孩子插入结点导致的不平衡应该进行左旋转。 /** * 约定null节点的高度为-1, 叶子结点高度为0。到根结点变大; * @param node 某一节...
2019-06-09 15:13:47
388
原创 基本排序之插入排序(Python语言实现)
一、插入排序原理学习插入排序时,查阅不少前辈的博文比如此文。再此也记录一下自己对插入排序的理解:将待排元素插入进已有序列中。已排序列在变长,待排序列在缩小。插入是这样步骤,取出一个数,与前面一个数比较,该数较小,那就将前面数往后挪一个位置。继续往前找,直至比前一个数大或者到达已排好的列开始为止,将取出的数放入。再取出一个数按前操作,直到所有待排数据全部插入为止。二、编码#!usr/b...
2019-06-09 14:10:48
242
原创 基于Qt的Opengles可编程管线学习——VAO(QOpenGLVertexArrayObject的使用)
标准OPenGLes2.0还没有引进VAO,应该是OpenGL3.0以后才有。不过Qt封装的OPenGLes2.0可以使用VAO,它就是QOpenGLVertexArrayObject。其用法与OpenGL3.0中的VAO用法一样。本文假设您熟悉OpenGL的vao。接下来我们一起来学习这个类的用法。一、QOpenGLVertexArrayObject的使用流程和VBO用法(可参考博主另外...
2019-06-01 11:05:37
4621
1
原创 基于Qt的Opengl可编程管线学习——纹理(QOpenGLTexture使用)
纹理,简单说就是将图片展示在物体表面。可以将其类比为墙纸。纹理分为1D,2D, 3D 三类。这里只讨论2D纹理。先要记录一下比较基本的概念。一、纹理坐标纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。和数学二维坐标一样。二、纹理创建Qt提供方便的纹理类——QOpenGLTexture。它使纹理操作变得非常简单。这样就创建了一个纹理对象了...
2019-05-25 23:57:56
5089
9
原创 Qt 自定义控件(一)——滑动切换效果的StackedWidget
漂亮的界面加点动画效果将显得更加炫酷。这一片将使用Qt的动画框架,子类化QStackedWidget实现页面的过渡切换效果。
2019-05-24 15:45:02
3964
原创 基于Qt的Opengl可编程管线学习—— VBO(QOpenGLBuffer的使用)
再一次赞扬Qt对OPenGL的支持真的是太棒了。之前一片文章介绍绘制三角形时,顶点位置数据与颜色数据是分开传递的。这篇文章将介绍如何使用Qt的VBO进行顶点数据传递以及数据格式解析。一、VBO的基本使用流程上图中是QOpenGLBuffer对象的使用方式,使用VBO之前必须调用create()创建。使用时,调用bind()。以告知OPenGL我们在使用的VBO。调用allocate()...
2019-05-23 13:13:32
6971
原创 基于c++新标准线程安全的单例模板实现
单例——在应用程序中某个类的实例只有一个,以便做全局访问点,这样可以协调系统的整体行为。也就是说提供访问某一资源(硬件设备、ini文件……)的统一接口。在此只讨论基于c++新标准的一个线程安全实现。涉及到CRTP(Curiously Recurring Template Prattern)的使用。先看以下知识点:1. c++新标准中指出:局部static变量的初始化是线程安全的。2. ...
2019-04-26 10:17:23
443
原创 基于Qt的OPenGL可编程管线学习之Hello Triangle
之前学习过OpenGL的固定管线,后来了解到现在大部分公司都用可编程管线(programmable pipeline)。所以决定开始研究学习可编程管线。Qt5.*之后对OPenGL的支持更好了。经过一番学习,写了一个基于Qt 的OpenGL例子——Hello Triangle Demo,在此记录一下加深一下印象,同时让像我一样的新手快速入门。本文假定您对OPenGL 的固定管线有所了解。...
2019-04-21 10:22:59
1061
原创 使用vs13编译boost为32位静态库
之前也记录过Qt中使用boost,最近在vs中使用boost有了些新发现,再此记录一下。一、编译过程1. windows开始键 --》所有程序 --》点击 Visual Studio 2013(文件夹标识) ---》Visual Studio Tools打开下图所示目录:2. 以管理员身份运行上图框中的快捷方式(上边是X64的,估计编译64位的运行这个吧)。然后切换到boost源码...
2019-03-26 10:58:37
511
原创 c++11之再探std::enable_shared_from_this
之前一片关于std::enable_shared_from_this<T>类的文章,只是简单探讨了一下这个类的使用方法与原因,经过不断的学习,对其又有了新的认识。为避免忘记所以来记录一下。一、它有啥作用这个类能够让shared_ptr<T>管理的资源安全的生成其他shared_ptr<T>引用,从而共享这个类的某一资源(就是malloc出来的对象)。实际...
2019-03-25 16:06:37
992
1
boost thread dll 应用
2018-04-06
springXmlBean.rar
2018-04-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅