自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 资源 (3)
  • 收藏
  • 关注

原创 从历史上最昂贵的空指针崩溃,论指针判空的重要性

2024年7月18日,美国信息安全巨头CrowdStrike推送的软件更新存在严重错误,导致全球范围内大量使用其软件的Windows电脑集体陷入“蓝屏”状态,无法正常使用。这场波及多个行业的“蓝屏”事件,不仅使多国航空、铁路、银行等基础设施服务中断,例如,特斯拉工厂生产因此暂停,马斯克称其为“史上最大IT失败”(Biggest IT fail ever),以此为导火索,特斯拉市值下跌了319.87亿美元。这次蓝屏的罪魁祸首,就是指针未判空导致的。

2024-07-22 15:06:34 386

原创 Chromium源码阅读(11):了解chromium base的raw-ptr

chromium base的rawptr.h引起了我的注意,常见的ptr封装有refed_ptr、weak_ptr等。raw_ptr还要封装吗?那一定是有特殊的意义。

2024-07-19 17:13:58 1035

原创 Chromium源码阅读(10):了解Log模块

Chromium许多日志被TraceEvent代替了,因此TraceEvent出现的频率要比Log高很多。但是也有不少场景使用Log。在blink,Log的实现由base提供,而blink/render/core/base/logging.h进行了二次封装。

2024-07-18 18:19:27 1201

原创 Chromium源码阅读(9):了解事件跟踪TRACE_EVENT与第三方库Perfetto

首先,在一个头文件中(例如。

2024-07-17 16:47:03 796

原创 编程随笔:控制复杂度是计算机编程的本质。

过度的技术追求可能会引入额外的复杂性,而这种复杂性并不总是必要的。事实上,一个过于复杂的系统不仅难以构建和维护,而且很难适应变化,这与敏捷和响应性的软件开发实践背道而驰。作为开发者,我们应该培养出在复杂性和简洁性之间平衡的直觉,并将其作为我们编程实践中的指导原则。通过控制复杂度,提高软件的质量和可维护性,提升自身的工作效率和团队的协作能力。他在编程社区具有深远的影响力。这并不是说我们应该避免使用先进的技术或者强大的工具,而是说我们在选择它们时,应该更有目的性,更注重它们是否真正适合我们的需求。

2024-07-16 11:25:16 208

原创 C++宏魔法:__VA_OPT__操作

_VA_OPT__被设计用于处理可变参数宏(variadic macros)中的逗号插入或移除问题。这个宏是在C++20标准中引入的,用于解决在可变参数宏中逗号操作的不确定性,特别是在需要条件性地添加或去除逗号的情况下。在C++中,可变参数宏允许宏接受不定数量的参数。它们由_VA_ARGS_标识符标识,代表了宏调用中传递的所有额外参数。

2024-07-15 11:32:00 1256

原创 Chromium源码阅读(8):了解Base库里的PartitionAlloc模块

malloc符号定义这个阶段负责覆盖mallocfree等符号,并将这些调用路由到分配器shim内部。这由中的头文件处理。在Windows上:Windows的UCRT(通用C运行时)导出了弱符号,我们可以在中覆盖它们。在Linux/CrOS上:分配器符号作为导出的全局符号在(对于mallocfree等)和(对于等)中定义。这使malloc符号在主可执行文件和任何第三方库中得到适当的拦截。在Android上:与Linux/CrOS的情况不同,加载时的符号拦截是不可能的。

2024-07-15 10:56:56 1151

原创 初步探究Rust生态与图形界面编程

今天,我们一起探讨Rust图形界面编程的现状、生态系统的发展,以及面临的挑战。与C++的Qt、C#的WPF或者JavaScript的Electron等成熟的图形界面框架相比,Rust的图形界面生态显得相对年轻。布局是在安全的 Rust 中自定义实现的,并支持双向文本。Rust的快速增长也带动了其社区的发展,从各种在线论坛、聊天室到官方和非官方文档,都可以找到关于Rust图形界面编程的讨论和帮助。Rust在图形界面编程领域虽然起步较晚,但其安全性、性能和现代化的语言特性,为其未来的发展提供了坚实的基础。

2024-07-12 14:20:04 865 1

原创 Chromium源码阅读(7):了解WTF的静态字符串机制

在浏览器的实现中,处理HTML和CSS涉及大量的字符串操作,这些操作通常包括字符串的比较、查找和匹配。如果使用普通的字符串对这些进行操作,在面临大量DOM元素和CSS规则时会导致效率低下。例如,当解析CSS时,属性名如colormarginpadding等在内部可以被转换为静态字符串。在后续的样式计算和匹配过程中,只需通过比较这些属性的ID,而不是一遍遍地比较完整的字符串。这种比较是通过简单的指针或整数比较来完成的,这要比字符串的字节级比较快得多。

2024-07-11 15:56:20 797

原创 如何写出清晰简洁的代码(通过一个实际的案例说明)

在软件开发中,清晰和简洁的代码是项目长期健康的关键。易读的代码不仅便于维护,还能减少错误的发生。通过分析一个具体的代码示例,我们来探讨如何提升代码的可读性和简洁性。

2024-07-11 10:33:11 421

原创 深入剖析C++的 “属性“(Attribute specifier sequence)

笔者最喜欢的C++属性就是[[nodiscard]]了,计划今天就在团队中推广开。因为许多开发者在调用一些可能失败的函数不检查返回值,导致代码鲁棒性较低。给一些重要函数加上[[nodiscard]]属性之后,编译器就能避免这种情况的发生,真是太有用了。如果向了解更多关于C++属性的知识,那么可以来cppreference看看。

2024-07-10 10:09:28 1221

原创 闲聊C++与面向对象思想

艾伦·凯曾说,“I made up the term object-oriented, and I can tell you I did not have C++ in mind.”(“我发明了术语‘面向对象’,可以告诉您我没有C++”)。今天看到这句话,激发了笔者写一篇文章聊聊C++与面向对象思想的关系。

2024-07-09 14:54:03 1250

原创 在编程活动中,比性能更重要东西是什么?

我们在进行技术问题讨论的时候,经常会涉及到这个问题。许多开发者对性能优化非常着迷,甚至许多人养成了“唯性能至上”的思维方式,甚至成为一种“政治正确”的事情,容易考虑许多非主流的技术方案来提高性能。本文希望说明一个观点:性能当然重要,但是还有比性能更重要的要素,在没有做好这些要素的适合,我们切勿对性能进行过早或过度的优化。

2024-07-08 11:13:37 623

原创 探寻操作系统文件名字符限制的规则和历史

从最早的电脑系统到现代的操作系统,文件命名的规则一直在不断发展,这些规则体现了不同操作系统设计哲学的差异。作为开发者,了解这些差异和背后的历史渊源非常有价值,本文将详细探讨Windows、macOS和Linux三大主流操作系统在文件名字符限制方面的差异和背后的历史原因。

2024-07-05 11:48:46 957

原创 用C++思路写高质量的C++代码

C++以其强大的功能和复杂性而著称。然而,笔者在工作种发现,许多开发者在写C++代码时,会不自觉地沿用C语言的思维模式,这大大限制他们充分利用C++提供的强大功能写出高效安全的代码。因此,本文将通过几个常见的字符串操作示例,展示如何以C++的方式思考和编写代码,以及C++思维方式的核心价值。

2024-07-04 10:54:49 943

原创 如何写出合格的C++构造和析构函数

笔者曾经在团队中发现有人在构造函数中读取文件配置,导致界面创建速度降低了一个数量级。由此引发笔者想讨论如何写一个合格的构造和析构函数文章的想法。

2024-07-03 15:50:31 869

原创 C++实现简化 QtBase(6):新增Timer定时器机制

在昨天的文章《》里,我们对EventLoop增加了Win32消息循环的支持。并支持post异步和延时任务。但是,还不支持timer的多次触发的定时器。今天我们一起来增加这个功能。

2024-07-03 14:33:20 956

原创 C++实现简化 QtBase(5):通过IEventLoopHost扩展实现win32消息循环

今天,我们在之前的CEventLoop的实现之上,通过IEventLoopHost扩展,实现一个windows系统的主线程消息循环扩展,使得我们可以在主线程post task。

2024-07-02 15:17:36 654

原创 聊聊C++20的三向比较运算符 `<=>`

从这一个小小的三相比较运算符的引入,我们可以看到C++的复杂之处与细心之处,我们也能一窥现代C++的发展趋势,具体的复杂和细心在哪里体现?本文为您揭晓。

2024-07-02 10:45:27 946

原创 C++实现简化 QtBase(4):增加简单实用的事件机制

前面的文章已经实现了许多QObject的功能了:C++实现一个简单的Qt信号槽机制C++实现简化版Qt信号槽机制(2):增加内存安全保障C++实现简化版Qt的QObject(3):增加父子关系、属性系统但是,Qt中还有一个关键的功能是事件系统。为了让我们的QObject也支持事件系统,我们可以设计一套简单实用的事件机制。设计事件循环事件系统离不开事件循环,截止到C++ 20标准库里没有一套官方的事件循环机制,可能是因为实现一个事件循环也不是什么难事吧。为了简化我们的事件循环机制,我们用到了一

2024-07-01 17:23:10 532

原创 C++实现简化版Qt的QObject(3):增加父子关系、属性系统

前几天写了文章:C++实现一个简单的Qt信号槽机制C++实现简化版Qt信号槽机制(2):增加内存安全保障之后感觉还不够过瘾,Qt中的QObject体系里还有不少功能特性没有实现。为了提高QObject的还原度,今天我们将父子关系、属性系统等功能也一并实现。接口设计首先,我们设计一下我们的接口。Qt的QObject类过于重,有的时候只用到部分功能的时候没必要引入额外的成员变量。因此我们将父子关系、属性系统这两部分单独抽离成为新的类。综合考虑下来,我们把支持静态、动态反射,信号槽的类改名为CObj

2024-07-01 15:41:52 793

原创 C++实现简化版Qt信号槽机制(2):增加内存安全保障

在上一篇文章中《C++实现一个简单的Qt信号槽机制》,我们基于前面的反射代码实现了信号槽的功能。但是上一篇的代码中没有对象生命周期管理的机制,如果在对象的生命周期结束后还存在未断开的信号和槽连接,那么信号触发时可能会尝试访问已经被析构的对象,从而引发内存访问异常。方案的确定在Qt框架中,QObject的析构函数,在对象销毁时会自动断开所有信号和槽的连接。从而避免出现这种情况。笔者考虑了一下,没有采取这种方案,因为:这会要求信号和槽两个对象互相存储双方的连接情况,在一定程度上浪费了内存。另一方面

2024-06-28 10:45:59 1331

原创 C++实现一个简单的Qt信号槽机制(1)

昨天写这个文章《深入探讨C++的高级反射机制(2):写个能用的反射库》的时候就在想,是不是也能在这套反射逻辑的基础上,实现一个类似Qt的信号槽机制?Qt信号槽机制简介所谓的Qt的信号槽(Signals and Slots)机制,是Qt框架中实现对象之间通信的一种方式。这是一个事件驱动程序中常见的设计模式。信号槽机制允许创建响应特定事件(如用户交互、数据变化等)的可重用组件。信号槽主要有以下核心概念组成:信号(Signals)信号是一个类成员函数的声明,它在类内部以 signals: 关键词标识。当

2024-06-27 16:23:33 1065

原创 系统性掌握C++17容器四件套:std::optional, std::any, std::variant, std::tuple

许多开发者分不清std::variant和std::any之间的区别,于是萌发了写一篇文章系统性介绍一下C++中这类容器的想法。

2024-06-27 10:24:11 853

原创 深入探讨C++的高级反射机制(2):写个能用的反射库

在现代软件开发中,反射是一种强大的特性,它可以支持程序在运行时查询和调用对象的属性和方法。但是在C++中,没有内置的反射机制。我们可以通过一些巧妙的技术模拟反射的部分功能。我们这个简单反射库就称为refl吧。refl库是一个用C++编写的轻量级反射框架,它允许在编译时和运行时对对象的属性和方法进行查询和操作。这个库需要使用C++17编译器编译。其完整源码如下:#include <iostream>#include <tuple>#include <stdexcep

2024-06-26 18:24:54 1138

原创 深入探讨C++的高级反射机制

反射是一种编程语言能力,允许程序在运行时查询和操纵对象的类型信息。它广泛应用于对象序列化、远程过程调用、测试框架、和依赖注入等场景。由于C++语言本身的反射能力比较弱,因此C++生态种出现了许多有趣的反射库和实现思路。我们在本文一起探讨其中的奥秘。

2024-06-26 11:54:51 1672

原创 探究Qt5【元对象编译器,moc】的 设计原理和技术细节

Qt5是一个跨平台C++框架,它有个突出的特点就是其元对象系统,该系统通过扩展C++的能力,为事件处理提供了信号与槽机制、为对象内省提供了属性系统,。为了支持这些特性,Qt引入了元对象编译器(moc),这用于解析C++头文件并生成附加的源代码,并与其他代码一起编译,实现元对象系统的功能。Qt的元对象编译器是Qt中相对复杂的一个部分,因此本文深入moc的技术细节,为你揭开Qt元对象系统神秘的面纱。

2024-06-25 11:50:48 1143

原创 在Qt中,直接include <moc_xxxxx.cpp> 为什么不会出现符号冲突的错误?

qmake 负责处理这个场景的编译问题。出于好奇也对比了这两个文件的内容,对比了moc_XXCardObjBase.cpp与2FELSIXJDY/moc_XXCardObjBase.cpp两个文件,发现其内容几乎一模一样,只有头文件的include路径变了。这个过程中,注意到XXX_autogen\include_Debug下新生成了moc_XXCardObjBase.cpp,这个文件和之前生成的moc_XXCardObjBase.cpp.d目录不一样,之前生成的在2FELSIXJDY子目录下。

2024-06-25 11:17:29 421

原创 深入解析VC Runtime:什么是vcruntimeXXX.dll和api-ms-win-crt-runtime-X-X-X.dll?

总之,运行时库的 DLL 文件通常会随着安装 Visual Studio 或运行安装了 Visual Studio 开发的应用程序时被安装到系统中。如果应用程序使用动态链接库(DLL)而非静态链接库(LIB)版本的运行时库进行编译,则在运行时需要这些 DLL 文件。缺少这些文件可能会导致应用程序无法运行。通常情况下,安装对应版本的 Visual C++ Redistributable 可以提供这些必需的运行时库文件。但是最佳实践是在安装包中打包所依赖的运行时,可以减少很多用户反馈。

2024-06-24 15:10:25 840

原创 运行时库链接方式实践指南(MT、MD、MTd、MDd)

通过本文系统性的介绍,相信你对运行时库的概念、特点。一致性的重要性有了更深的认识。

2024-06-24 10:29:27 956

原创 Qt源码阅读笔记:初步了解QtCore模块目录结构

Qt框架是一个跨平台的C++应用程序框架,广泛用于开发图形用户界面程序以及用于无界面后台操作的工具和服务器。它由多个模块组成,其中QtCore模块提供了核心的非GUI功能。QtCore 提供了元对象系统,扩展了c++ 在元对象系统的基础上,qt又提供了信号/槽、property以及对象树等特性除此之外,还提供了Qt容器、Qt文件、Qt线程、Qt事件、QtTimer等一些列非常有用的工具。QtCore源代码包含大量的详细信息和复杂的实现细节,通常需要结合Qt官方文档进行学习和理解。

2024-06-21 15:35:53 1342

原创 C++:你用过MultiIndex容器吗?

作为C++开发者,我们对键值容器非常熟悉,例如std::set、std::map、std::unordered_map等。这些容器以其强大的功能和高效的性能,成为我们处理数据存储和检索任务时的得力助手。但是你用过多键容器(MultiIndex)吗?

2024-06-21 10:36:14 1000

原创 Qt底层原理:深入解析QWidget的绘制技术细节(2)

在传统的C++图形界面框架中,例如DUILib等,控件的绘制逻辑往往直接在控件的类的内部,例如PushButton的draw/paint的函数内部,Qt的QWidget费了老大劲,定义了一堆枚举和基类,把大部分的绘制逻辑都抽离了具体的类,转到了QStyle上。这种做法说实话,是有弊有利的。

2024-06-19 11:29:10 856

原创 Qt底层原理:深入解析QWidget的绘制技术细节(1)

在Qt5中,QWidget的绘制流程比较分散,网上介绍的文章也很少,因此写一篇文章总结记录一下这部分的知识点。

2024-06-19 11:27:46 1837

原创 Java 18新特性梳理

Java 17 中包含 14 个特性,Java 16 中包含 17 个特性,Java 15 中包含 14 个特性,Java 14 中包含 16 个特性。相比于前面发布的版本来说,Java 18 的新特性少了很多。: 继续发展向量API,通过利用硬件的SIMD指令优化性能,进行第三轮孵化,展示了更多改进和新特性。: 开始废弃对象终结机制,准备在将来的版本中移除,鼓励开发者使用更可靠的资源管理技术。: 引入了一个新的SPI,允许自定义网络地址解析策略,提高了灵活性和可配置性。

2024-06-18 14:44:48 797

原创 “锟斤拷,烫烫烫,屯屯屯”的由来

在程序开发过程中,调试是不可或缺的一环。调试不仅可以帮助开发者发现错误,还能提供程序运行时的内部状态信息。然而,在调试过程中,开发者有时会遇到一些奇怪的字符。这些乱码通常是由内存状态的特殊标记,或者字符集不匹配导致的。在本文中,我们将探讨这些乱码的由来,以及它们在程序开发中的含义。

2024-06-18 10:19:16 872

原创 掌握现代C++的模板元编程类型检测技术

最近写代码恰好用到了C++模板元编程的类型检测能力,以前对其原理有个大概的印象,但随着C++11/C++17等新特性的加入,很多做法和以前不同了,借此机会重新梳理一下这方面的知识点。

2024-06-17 10:30:37 1002

原创 Chromium源码阅读:从页面加载到元素展示(1)

​今天,我们一起来看看一个html元素,是如何绘制到界面上。我们选择了最简单的场景,便于快速掌握总体的渲染流程。

2024-06-14 15:45:18 1256

原创 Chromium源码阅读:Mojo实战:从浏览器JS API 到blink实现

这个API是Web标准API,肯定在blink/render下面,简单一搜就找到了:> get(> get(// Cookie Store API的解释器文档链接// 定义一个名为CookieStore的接口,它在ServiceWorker和Window环境中被暴露,Exposed=(ServiceWorker,Window), // 暴露给ServiceWorker和WindowSecureContext // 并且仅在安全上下文中可用(如HTTPS)

2024-06-13 17:05:55 1091

原创 Chromium源码阅读:Mojo框架的 Mojo IDL(Interface Definition Language)介绍

属性描述[Sync]允许接口方法能够同步地等待响应在等待同步消息响应时,禁止被其他同步消息打断[Default]为枚举或联合体指定默认值允许枚举或联合体在未来扩展,不对接收到的新值进行验证[Native]用于在C++绑定中与旧的或宏建立桥接指定字段、枚举值、接口方法或方法参数引入的版本号[Stable]指定类型或接口定义在时间上是稳定的,适用于持久存储或版本偏差二进制之间的通信与特定接口相关联的UUID,即使接口名称变化,UUID也应保持稳定根据GN文件中的列表条件性地启用定义根据GN文件中的。

2024-06-13 11:32:47 1151 1

windows核心编程

著名的windows核心编程,完整版。打包下载 Windows核心编程(第5版)针对Windows XP,Windows Vista和Windows Server 2008全面修订。主题广泛,内容丰富,讲解深入而精辟。透过这本Windows编程经典,我们可以在专家的悉心指导下,洞悉Windows编程精华,深入了解高级编程技巧,编写出高性能的Windows应用程序。

2011-08-29

空空如也

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

TA关注的人

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