- 博客(253)
- 资源 (3)
- 收藏
- 关注
原创 C++杂记——闭包Closure
维基百科解释:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是在支持头等函数的编程语言中实现词法绑定的一种技术。闭包在实现上是一个结构体,它存储了一个函数(通常是其入口地址)和一个关联的环境(相当于一个符号查找表)。环境里是若干对符号和值的对应关系,它既要包括约束变量(该函数内部绑定的符号),也要包括自由变量(在函数外部定义但在函数内被引用),有些函数也可能没有自由变量。
2025-03-03 20:17:16
306
原创 排序算法——快速排序
快速排序(Quicksort),又称分区交换排序(partition-exchange sort),是一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序nn个项目要OnlognOnlogn(大O符号)次比较。在最坏状况下则需要On2On2次比较,但这种状况并不常见。事实上,快速排序ΘnlognΘnlogn通常明显比其他算法更快,因为它的内部循环可以在大部分的架构上很有效率地达成。
2025-03-03 09:47:19
881
原创 排序算法——冒泡排序
冒泡排序(Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
2025-03-02 23:35:53
652
原创 排序算法——选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对nn个元素的表进行排序总共进行至多n−1n−1次交换。
2025-03-02 23:23:35
623
原创 排序算法——插入排序
插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O1O1的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
2025-03-02 23:10:28
329
原创 C++杂记——RAII (Resource Acquisition Is Initialization)
RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种C++编程习惯和原则,旨在通过资源的生命周期管理来保证资源的安全和有效使用。RAII的核心思想是将资源的获取和释放绑定到对象的生命周期。当对象被创建时,它会分配相应的资源;当对象的生命周期结束(例如超出作用域时),其析构函数会自动被调用,从而释放资源。它使得我们得以规避“裸new操作”和“裸delete操作”的风险,避免裸new和裸delete可以使我们的代码远离各种潜在风险,避免资源泄漏。
2025-03-02 13:29:50
335
原创 C++杂记——返回值优化(RVO,Return Value Optimization)
返回值优化(RVO):当函数返回一个对象的临时副本时,编译器可能会调用移动构造函数来优化性能,尤其是在对象较大的情况下。
2025-03-02 13:11:13
268
原创 C++11新特性
c++11新增了几种数据类型:、、等原始字符串简单来说,“原生的、不加处理的”,字符表示的就是自己(所见即所得),引号、斜杠无需 “\” 转义,比如常用的目录表示,引入原始字符串后,非常方便。格式如下:类型别名声明C++11标准规定了一种新的方法,使用别名声明(alias declaration)来定义类型的别名:这种方法用关键字using作为别名声明开始,后面紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名。类型别名和类型的名字等价,只要是类型的名字能出现的地方,就能使用类型别名。
2025-03-02 13:02:53
1169
原创 C++杂记——RTTI
RTTI(Runtime Type Information)是C++中的一个特性,允许程序在运行时获取类型信息。它主要用于多态(尤其是基于类的多态)时,帮助判断对象的实际类型。RTTI的主要功能RTTI的原理 RTTI的实现依赖于编译器在编译时生成一些额外的信息。注意事项。
2025-03-02 00:51:10
329
原创 C++杂记——尾递归
编译器可以做到这一点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可以做,因此也就没有保存栈帧的必要了,通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。注意,后面这段代码的递归也发生在函数末尾,但它不是尾递归。使用尾递归可以带来一个好处:因为进入最后一步后不再需要参考外层函数(caller)的信息,因此没必要保存外层函数的stack,递归需要用的stack只有目前这层函数的,因此避免了栈溢出风险。
2025-03-01 23:53:09
691
原创 ramdisk 运行虚拟机
接下来,我们需要指定RAM disk的大小,文件系统和设备名,然后将它挂载到一个目录下。从上面的截图可以发现,我的系统还有大量可用的内存空间,所以我完全可以分配1G给RAM disk。内核有个模块叫brd,这个ko可以在系统中创建多个ramdisk 设备,通过modeinfo brd可以查看该模块的具体信息和参数。现在,如果我将一个文件复制到/tmp/ramdisk目录下,我的内存使用量就会上升对应的大小。如果采用方法一创建的ramdisk,那么直接把镜像文件拷贝到ramdisk的文件夹中。
2025-02-24 23:34:34
822
原创 C++杂记——Overload、Override和Overwrite
重载的概念最好理解,在同一个类声明范围中,定义了多个名称完全相同、参数(类型或者个数)不相同的函数,就称之为Overload(重载)。重载的特征如下:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。也称为改写,覆盖的概念其实是用来实现C++多态性的,即子类重新改写父类声明为virtual的函数。Override(覆盖)的特征如下:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数列表完全相同;(4)基类函数必须有v
2025-02-24 12:12:22
1378
原创 C++多线程编程基础
内存模型——memory model:这是对内存并发访问的一组保证,主要是确保简单的普通访问能按人们的朴素预期工作对无锁编程(programming without locks)的支持:这是一些避免数据竞争的细粒度底层机制一个线程(thread)库:这是一组支持传统线程-锁风格的系统级并发编程的组件,如thread、conditional_variable和mutex。
2025-02-23 23:58:52
918
原创 C++标准库——move、万能引用和forward
当希望用一个移动操作”窃取“一个对象的表示形式时,使用move;当希望转发一个对象时,用forward。因此,forward(x)总是安全的,而move(x)标记x将被销毁,因此要小心使用。调用move(x)之后x唯一安全的用法就是析构或是赋值的目的。显然,一个特定类型可能提供更多的保证,理想情况下类的不变式保持不变。但是,除非你确切知道这类保证,否则不要依赖他们。
2025-02-22 22:24:39
532
原创 C++标准库——时间
标准库提供了time_point,用来表示给定纪元的一个时间点,用给定的clock度量。一个纪元(epoch)就是由给定clock确定的一个时间范围,用duration来衡量,从。其中Rep表示一个算术类型,用于表示时钟ticks数;Period表示一个时钟tick周期(可以理解为一个tick多少秒),这里是一个。在chrono中,标准库提供了基本的时钟接口。在我的系统上,他们的输出是一样的。
2025-02-22 19:52:22
342
原创 C++标准库——智能指针
auto_ptr是C++11前标准库提供的一种智能指针,它具有unique_ptr的部分特性,但不是全部。weak_ptr指向一个shared_ptr所管理的对象。它最大的限制是,为了保证所有权唯一,在拷贝复制后,会将原auto_ptr中管理的指针置空,此时再次操作原auto_ptr会导致空指针。若使用计数器用来保持使用计数结构活跃,因为在对象的最后一个shared_ptr的声明期结束后,仍可能有weak_ptr活跃。对weak_ptr而言,为了访问它的对象,必须将它转换成shared_ptr。
2025-02-22 15:32:22
931
原创 C++ 标准库——函数对象和函数适配器
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。许多标准库算法都接受函数对象(或函数)参数,用来控制其工作方式。:g(arg2)等价与f(arg3),其中arg3是通过arg2中的实参替换arg中对应的占位符得到的。另外,bind接受普通表达式做参数,着导致对引用参数而言,在bind看到他们的时候已经被解引用了。所谓函数适配器就是就受一个函数参数,返回一个可以用来调用该函数的函数对象。
2025-02-21 23:57:58
760
原创 C++ STL基础
STL(Standard Template Library,标准模板库),顾名思义是一堆C++模板及其支持工具所组成的库,由于STL基本占据了C++标准库的绝大部分内容,所以有时也用STL指代C++标准库。容器(containers):各种数据结构,是一种class template算法(algorithms):各种常用算法,是一种function template迭代器(iterators):连接容器和算法,是所谓的“泛型指针”
2025-02-21 17:08:29
1000
原创 QT事件循环
事件循环是可以嵌套的,当在子事件循环中的时候,父事件循环中的事件实际上处于中断状态,当子循环跳出exec之后才可以执行父循环中的事件。当然,这不代表在执行子循环的时候,类似父循环中的界面响应会被中断,因为往往子循环中也会有父循环的大部分事件,执行QMessageBox::exec(),QEventLoop::exec()的时候,虽然这些exec()打断了main()中的QApplication::exec(),但是由于GUI界面的响应已经被包含到子循环中了,所以GUI界面依然能够得到响应。
2025-02-20 23:24:00
845
原创 QT信号槽使用
其中sender为信号发送对象,receiver为信号接收对象,signal和method为通过QMetaMethod获取到的元信息,type为连接类型。其中sender为信号发送对象,receiver为信号接收对象,signal和method为信号和槽的签名字符串,一般用SIGNAL和SLOT宏来转换,type为连接类型。其中sender为信号发送对象,receiver为信号接收对象,signal为slot为成员函数指针,分别指向信号和槽函数,type为连接类型。,就是将sender本身的信号和槽绑定。
2025-02-20 16:12:07
993
原创 Linux系统调用
POSIX标准针对的是API而不是系统调用,判断一个系统是否与POSIX兼容,要看它是否提供一组合适的应用编程接口,而不是看它的系统调用是如何定义和实现的。一个API接口函数可以由一个系统调用实现,也可以由多个系统调用实现,或者完全不由系统调用实现。C库中提供了POSIX的绝大部分的API实现,同时也为内核提供的系统调用封装了相应的函数。Linux系统为每个系统调用赋予了一个系统调用号,系统调用号一旦分配之后就不会有任何变更,否则编译好的应用程序就不能运行了。在x86_64上,其系统调用号定义在。
2025-02-13 23:22:52
921
原创 Linux驱动程序——带缓冲区的简单虚拟设备
入下图所示,一个简单的虚拟设备只有一个缓冲区或者FIFO的部件,实现了一个先进先出的缓冲区。用户程序可以通过wirte()函数把用户数据写入这个虚拟设备的FIFO中,还可以通过read()函数把虚拟设备上的FIFO数据读出到用户空间的缓冲区里面。用来将用户空间的数据写入环形缓冲区中,其中参数fifo表示使用哪个环形缓冲区;type表示缓冲区中数据的类型;Linux内核实现了一个称为KFIFO的环形缓冲区的机制,它可以在一个读者线程和一个写者线程并发执行的场景下,无需使用额外的锁来保证环形缓冲区的数据安全。
2025-02-10 12:12:10
296
原创 Linux debugfs虚拟文件系统
环境:Linux dev-PC 5.18.17-amd64-desktop-hwe #20.01.00.10 SMP PREEMPT_DYNAMIC Thu Jun 15 16:17:50 CST 2023 x86_64 GNU/Linuxdebugfs是一种用来调试内核的内存文件系统,可以通过debugfs和用户空间交换数据。总用量 0drwxr-xr-x 2 root root 0 2月 9 11:29 acpidrwxr-xr-x 13 root root 0 2月 9 11:30 bdi。
2025-02-09 17:08:59
254
原创 Linux sysfs虚拟文件系统
测试环境:Linux dev-PC 5.18.17-amd64-desktop-hwe #20.01.00.10 SMP PREEMPT_DYNAMIC Thu Jun 15 16:17:50 CST 2023 x86_64 GNU/Linuxsysfs虚拟文件系统是随着linux统一设备驱动模型一起诞生的。这个新的设备模型是为了对计算机上的所有设备进行统一地表示和操作,包括设备本身设备之间的连接关系。
2025-02-09 16:47:26
669
原创 Linux proc虚拟文件系统
测试环境:Linux dev-PC 5.18.17-amd64-desktop-hwe #20.01.00.10 SMP PREEMPT_DYNAMIC Thu Jun 15 16:17:50 CST 2023 x86_64 GNU/Linuxproc虚拟文件系统是linux内核提供的一种让用户和内核内部数据结构进行交互的机制。proc文件系统并不是真正意义上的文件系统,它存在于内存中,并不占用磁盘空间。
2025-02-09 15:25:40
934
原创 Linux ftrace 内核跟踪入门
ftrace 是内建于 Linux 内核的跟踪工具,从 2.6.27 开始加入主流内核。使用 ftrace 可以调试或者分析内核中发生的事情。ftrace 提供了不同的跟踪器,以用于不同的场合,比如跟踪内核函数调用、对上下文切换进行跟踪、查看中断被关闭的时长、跟踪内核态中的延迟以及性能问题等。系统开发人员可以使用 ftrace 对内核进行跟踪调试,以找到内核中出现的问题的根源,方便对其进行修复。
2025-02-07 23:44:19
1277
原创 Markdown绘图
目前使用Mermaid扩展,具体用法参考官方文档:https://mermaid.js.org/intro/。需要注意的是不同的markdown编辑器对扩展的支持程度不同。
2025-02-06 15:25:00
181
原创 Effective C++笔记
尽可能延后变量定义式的出现。这样可以增加程序的清晰度并改善程序效率。绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual函数——你唯一应该覆写的东西——却是动态绑定的。当我们编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template 内部的friend函数”。
2025-01-24 21:33:38
809
1
原创 spice-gtk简介
首先要提的是spice项目,SPICE 项目旨在提供一个完整的开源解决方案,以实现无缝远程访问虚拟机,从而让您可以轻松地播放视频、录制音频、共享 USB 设备以及共享文件夹。如何使用spice-gtk实现一个spice客户端,可以直接参考他的spicy工具的实现。spicy的效果如下,总的来说该有的功能基本都有,完全可以作为一个VDI 桌面客户端使用。spice-gtk项目提供基于GTK的客户端和库,用于 SPICE 远程桌面服务器。spice-gtk是一个大的项目,还是比较复杂的。
2025-01-11 21:35:45
692
原创 usbredir学习
usbredir 最初是为与 Spice 配合使用而创建的,但该协议和 usbredirhost 完全独立于 Spice,它们也可以用于创建 VNC 扩展,以便通过 VNC 连接将 USB 设备重定向到 QEMU 虚拟机。可以发现,原来导出的设备重新被attach进去了,此时lsusb又可以看到该设备了,设备又回到本地了。一个实现 usbredir 连接中 usb-host端的库,这是实际usb设备所连接的一端。被导出的设备被reset掉了,本地lsusb是看不到这个设备了,设备从本地导出了。
2025-01-11 20:27:34
1078
原创 USB学习——基本概念
USB全称为Universal Serial Bus(通用串行总线),是一种快速、灵活的总线接口。它是为了解决日益增加的PC外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信标准。USB一般分为USB低速,USB全速,USB高速和USB超高速,其分别对应于USB1.0,USB1.1,USB2.0和USB3.0,而USB3.0又分了GEN1,GEN2等。最新一代是USB4,传输速度为40Gbit/s,三段式电压5V/12V/20V,最大供电100W ,新型Type C接口允许正反盲插。
2025-01-10 20:12:02
860
原创 libusb学习——简单介绍
libusb 是一个 C 库,提供对 USB 设备的通用访问。它旨在帮助开发人员开发与 USB 硬件通信的应用程序。它是可移植的:使用单个跨平台 API,它可以访问 Linux、macOS、Windows 等上的 USB 设备。它是用户模式:应用程序与设备通信不需要特殊权限或提升。它与版本无关:支持所有版本的 USB 协议,从 1.0 到 3.1(最新)。支持主流平台:Linux, OS X, Windows, OpenBSD/NetBSD, Solaris and Haiku。
2025-01-10 20:00:18
2040
原创 strace工具简单入门
实际上,在一个进程被跟踪之后,跟踪者进程会在某种意义上充当被跟踪进程的父进程(如使用ps命令就可以看到他们的父子关系),而子进程真正的父进程被保存在其task_struct结构的real_parent成员中。一个进程被跟踪后,他只要接收到一个信号(即使这个信号被设置为忽略)就会停止运行(SIGKILL除外),然后父进程会在每次调用wait()时得到子进程停止运行的通知,这时父进程就可以检测和修改子进程了,随后父进程可以让子进程继续运行。addr和data用于修改和拷贝被跟踪进程的进程地址空间的数据。
2025-01-10 00:03:17
1009
原创 perf工具简单入门
它不但可以分析制定应用程序的性能问题(per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用程序和内核,从而全面理解应用程序中的性能瓶颈。perf (Performance analysis tools for Linux)是Linux的一款性能分析工具,能够进行函数级和指令级的热点查找,可以用来分析程序中热点函数的CPU占用率,从而定位性能瓶颈。这种模式, 上面列出的都是perf支持的子命令,如果不知道这些子命令需要哪些参数,一般可以通过。生成的svg图片就是火焰图。
2025-01-09 22:40:57
339
原创 GDB入门
GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。在函数foo中,如果x>0时断住,并自动打印x,然后运行程序。查看程序/进程构造的几个方法。
2025-01-09 14:02:27
759
原创 Linux内核学习——数据结构
FIFO的全称是“First In First Out”,即先进先出的数据结构,它采用环形缓冲区的方法来实现,并提供一个无边界的字节流服务。添加节点函数有三个,分别是添加到指定哈希链表头上hlist_add_head()、添加到指定节点前面hlist_add_before()、添加到指定节点后面hlist_add_behind()。第三个数据是要复制数据元素的数量。添加节点到一个链表中,内核提供了几个接口函数,如list_add()是把一个节点添加到表头,list_add_tail()是插入表尾。
2025-01-07 22:48:49
1432
Mathematics for Computer Science
2018-05-07
USB/IP - a Peripheral Bus Extension for Device Sharing over IP
2023-01-30
USB/IP: A Transparent Device Sharing Technology over IP Network
2023-01-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人