自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 Qt源码剖析之事件循环系统(一)—事件系统 1b79b8e4d4cd80fabeb6e9489d8275c6

Qt 允许创建自己的事件类型。事件在多线程应用中起到很大的作用。相比于信号和槽机制、函数调用,事件可以以同步(sendEvent)或异步(postEvent)的方式使用。注:信号和槽其实也可以以同步()或异步()的方式在多线程间使用。相比于信号和槽机制、函数调用,事件可以被过滤。

2025-03-18 03:00:44 373

原创 Qt源码剖析之事件循环系统(二)—事件循环系统的实现 1b09b8e4d4cd80ea8ea2d2f5e7705310

windows 没太研究过,这次基于 linux 进行分析。Linux 平台下的事件分发器通常会创建为或,我选择前者进行分析。接下来的代码比较长,事件循环的主要逻辑就在此实现,因此不省略代码,简单搂一眼就行。// 发送 awake() 信号, 通知当前事件循环已经唤醒// 发送 PostedEvent// 是否处理定时器事件// 是否处理 socket 事件,如果不处理也不会丢弃// 如果没事件需要处理,是否等待= 0;

2025-03-18 02:59:46 250

原创 Qt 核心机制源码分析之元对象系统

元对象系统通过编译期代码生成(Moc)和运行时元信息查询,在C++静态类型系统上实现了动态反射能力。这种"代码生成+静态数据"的设计,在性能与灵活性之间取得了巧妙平衡,是Qt框架的核心基石。voidvoid关于 `QMetaObject::activate` ,后续在信号和槽的篇章中介绍。### 总结元对象系统通过编译期代码生成(Moc)和运行时元信息查询,在C++静态类型系统上实现了动态反射能力。

2025-03-03 02:23:52 764

原创 QScopeGuard 源码分析

1、实现一个ScopeGuard的关键,是需要存储各式各样的"函数",如函数指针、lambda以及functor。2、C++11版本中,利用一个模板工厂函数,解决类模板无法自动推导类型的问题。但是由于C++11不支持std::decay以及模板推导指引,工厂函数的参数采用值类型传递,中间会进行拷贝操作,性能较差。但也解决了悬垂引用的问题。3、C++17版本利用模板推导指引,同时拥有类模板类型自动推导的特性,实现了直接构造的方法,不需要依赖工厂函数了。

2025-02-23 04:48:08 344

原创 Qt源码剖析之事件循环系统

本文基于 Qt6.2 源码进行分析。从主事件循环入手,分析 Qt 事件循环系统的主要实现(部分细节省略)。

2025-01-31 08:22:36 899

原创 enable_shared_from_this实现原理

如果需要使用this指针构造,T 必须public 继承,且 T 的构造需要通过,否则毫无意义。也就是说如果你不打算用智能指针管理你的实例,你压根不需要考虑这些。类成员shared_ptr构造函数->->

2024-09-23 03:36:46 1807

原创 Effective C++ chapter_6

6 继承与面向对象设计条款 32 确定你的 public 继承塑模出 is-a 关系“Derived is a Base!”​ 当一个类可以描述成 is-a 这样的概念的时候,就应该用 public 继承。例. 每个学生都是人,但人不一定是学生。因此学生类应该 public 继承自 “人” 类。请记住 :​ 1. “public” 继承意味 is-a。适用于 base classes 身上的每一件事情一定也适用于 derived classes 身上,因为每一个 derived class 对象

2021-10-06 00:56:33 1108

原创 Effective C++ chapter_5

5 实现条款 26 尽可能延后变量定义式出现的时间​ 我们写代码的时候,可能会定义一些没有使用的变量,特别是当你过早的定义一个变量,从定义到使用中间如果出现异常且该异常被丢出,那么你就要承担不必要的构造和析构成本。​ 所以尽量在你使用到变量的前一刻再定义它。请记住 :​ 1. 尽可能延后定义式的出现。这样做可以增加程序的清晰度并改善程序的效率。条款 27 尽量少做转型动作​ C++ 规则的设计目标之一是,保证“类型错误”绝不可能发生。C++ 提供了四种转型方法 :const_cast 通

2021-09-08 19:53:16 200

原创 第三章部分习题(待续)

第三章部分习题练习 3.10 编写一个非递归的 comma 函数,运用 bytes.Buffer,而不是简单的字符串拼接。func commaNoRecur(s string) string { n := len(s) if n <= 3 { return s } var buf bytes.Buffer var dot byte = ',' for i := 0; i < n; i++ { if (n - i) % 3 == 0 && i != 0 {

2021-09-03 23:46:28 170

原创 Effective C++ chapter_4

4 设计与声明条款 18 让接口容易被正确使用第一点 设计接口的时候,应该考虑用户会做出什么样的错误。​ 对于一些有特定含义的参数,可以使用外覆类型(wrapper types)来区别参数。例 :struct Day{ explicit Day(int d) : val(d) { } int val;};struct Month{ explicit Month(int m) : val(m) { } int val;};struct Year{

2021-09-01 23:01:19 151

原创 Effective C++ chapter_3

资源管理条款 13 以对象管理资源​ “以对象管理资源“”也被称为“资源取得时机便是初始化时机(RAII)”。获得资源后立即放进管理对象内,即在构造函数中获取资源。管理对象(managing object)运用析构函数确保资源被释放。​ 在C++11中,应该使用 shared_ptr 和 unique_ptr 来管理指针,因为C++的RAII机制会在两者的析构函数中自动 delete 掉指针。​ 两者区别 :shared_ptr 内部管理一个“被引用计数器”,用来指示有多少个 share

2021-08-30 14:09:30 147

原创 Effective C++ chapter_2

2 构造/析构/赋值运算条款 05 了解 C++ 默认编写并调用哪些函数当没有在类中显示声明,编译器则会声明默认版本的 copy 构造函数、 copy assignment 操作符和一个析构函数。编译器默认生成的函数是 public 和 inline 的。class Empty{ };Empty e1;//default constructorEmpty e2(e1);//copy constructore2 = e1;//copy assignment operator//初始化都

2021-08-27 03:10:06 224

原创 Effective C++ chapter_1

1 让自己习惯C++条款 01 视 C++ 为一个语言联邦C : C++以C为基础,block、语句、预处理器、内置数据类型、数组、指针都来自于C。当使用C++中的C成分工作时,没有模板(Template)、没有异常(Exceptions)、没有重载(overloading)。Object-Oriented C++ : 也就是 C with classes,classes(包括构造函数和析构函数)、封装(encapsulation)、继承(inheritance)、多态(polymorphis

2021-08-24 00:07:55 200

原创 APUE 第一章 UNIX基础知识

第一章 UNIX基础知识1 UNIX体系结构内核 : 控制计算机硬件资源,提供程序运行环境的一种软件,也可称之为操作系统。shell : 一个特殊的程序,为运行其他程序提供一个接口。公用函数库 : 构建在内核的接口(系统调用)之上。如图,应用程序可以直接调用内核接口、shell以及公用函数库1.1 登录登录名用户登录的名字、标识。可以在系统的口令文件中查看相关信息。命令文件通常在/etc/passwd中,如图,每一行都是一个登录项,登录项的格式如下:​ 登录名 : 加密口令

2021-08-22 02:18:11 947

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除