- 博客(20)
- 收藏
- 关注
原创 Vulkan官方教程(一)
本文首先是对 Vulkan 的简单介绍,以及其主要解决的问题。之后我们来看一下如果画一个三角形都需要什么。获得一个整体认识,在理解后续的内容会有很大帮助。最后,我们将介绍 Vulkan API 的结构以及其一般使用方式。
2025-06-20 17:20:58
336
原创 子目录使用
简单项目中将所有文件置于同一目录没有问题,但是实际过程中通常会存在多个目录,不同目录存放各自类型相同或功能相关的文件。当存在多个目录时,项目结构会各不相同,而这也会影响构建的过程。在多目录项目中 CMake 会用到两个基础命令 add_subdirectory 和 include()。这些命令会将其他文件或目录中的内容引入构建过程中,从而使得构建逻辑能够分布在各目录层级结构中,而非强制所有内容都定义在最顶层。
2025-06-16 16:11:03
595
原创 (五)变量、字符串、列表和科学计算
前面的章节介绍了如何定义基本目标以及如何生成构建输出。单就这一点而言,已经够用了,但 CMake 还具备一系列其他功能,这些功能带来了极大的灵活性和便利性。本章介绍了 CMake 中最为基础的部分之一,即变量的使用。
2025-06-16 14:37:13
662
原创 (四)构建简单目标
创建一个可执行程序是所有的项目基本诉求,但对于大型项目来说,使用库文件来管理项目也是必需的。CMake 提供了多种类型库文件,兼容了不同平台之间的区别的同时,支持它们独特的本地化特性。同 add_executable() 命令类似,targetname 和 EXCLUDE_FROM_ALL 具有同样的意义和作用,不同的是库有三种类型:STATIC、SHARED、MODULE。STATIC:表示静态库和文档。
2025-06-16 10:15:19
569
原创 (三)最小构建
所有 CMake 项目起始于一个 CMakeLists.txt 文件,可视为 CMake 的工程文件,它定义了关于构建的所有:从源码到目标文件,包括测试、打包以及其他自定义任务。继续以源文件为例来说明,CMake 定义它自己的语言,比如变量、方法、宏、逻辑判断、循环、注释等等。每一行包含一条内置的 CMake 命令,类似于其它语言中的函数调用,除了它们包含多个参数且不直接返回值外。参数之间以一个或多个空格分隔,也可以分隔成多行。
2025-06-13 15:08:06
768
原创 (二)建立项目
摘要:CMake通过CMakeLists.txt文件管理项目结构,区分源目录(含源代码)和构建目录(存放生成文件)。推荐使用out-of-source构建方式,支持多配置生成。配置时需选择生成器类型(如Unix Makefiles),通过命令行执行构建过程。最佳实践包括:保持源目录与构建目录分离、定期测试不同生成器、使用cmake --build命令调用构建工具。这确保了项目的跨平台兼容性和构建一致性。(149字)
2025-06-13 11:23:09
491
原创 CMake构建C++项目(一)
本文介绍了在Windows 11环境下使用gcc 13.2.0、CMake 4.0.2和VSCode搭建C++开发环境的完整流程。文章详细说明了开发工具安装方法、项目目录结构设计、多模块CMakeLists.txt配置(包含主程序规划模块process和pnc_map两个子模块),以及编译运行过程。最终生成planning_main.exe及两个动态链接库,实现了控制台输出功能。项目代码已开源,可作为Windows下C++项目开发的入门参考。
2025-06-07 23:59:02
533
原创 Windows 中安装配置终端Oh-my-posh
本文介绍了在Windows 11系统下配置终端环境的详细步骤。首先说明选择Windows 11的原因,然后分步讲解:1)安装NerdFonts字体;2)使用winget或手动命令安装oh-my-posh并进行终端美化配置;3)简单说明Neovim的安装方法和配置文件路径设置。文章强调简化操作流程,避免不必要的软件安装,并提供了每个步骤的截图和具体命令。最终目标是实现一个美观实用的终端环境,满足日常开发需求。特别提醒用户不必过度追求最新版本,稳定够用即可。
2025-06-06 10:30:22
613
原创 (一)数据结构和算法的框架思维
种种数据结构,皆为数组(顺序存储)和链表(链式存储)的变换。数据结构的关键点在于遍历和访问,即增删查改等基本操作。种种算法,皆为穷举。穷举的关键点在于无遗漏和无冗余。熟练掌握算法框架,可以做到无遗漏;充分利用信息,可以做到无冗余。
2025-03-31 15:25:23
720
原创 (三)Redis内存兜底策略——内存淘汰及回收机制
在算法的选择上,Redis需要能够快速地查询添加删除数据,也就是说查询、添加、删除的时间复杂读需为O(1)。哈希表能保证查询数据的时间复杂度为O(1)。Redis内存淘汰机制是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据Redis提供了八种内存淘汰策略,分别是:noeviction:不会淘汰任何键,达到内存限制后返回错误allkeys-random:在所有键中,随机删除键volatile-random:在设置了过期时间的键中,随机删除键。
2025-03-21 16:43:59
668
原创 (二)缓存更新的四种策略及选取建议
缓存更新是指在数据发生变化时,保持缓存和数据库的数据一致性的问题。如果缓存和数据库的数据不一致,会导致用户看到过期或者错误的数据,影响业务逻辑和用户体验。不同于以上三种,应用程序无需等待数据的刷新,也无需自己去触发数据的刷新,而是后台服务来完成这些操作。
2025-03-21 16:13:26
1112
原创 (一)redis十种数据类型及底层原理
string 是 Redis 最基本的数据类型,它可以存储任意类型的数据,比如文本、数字、图片或者序列化的对象。一个 string 类型的键最大可以存储 512 MB 的数据。string 类型的底层实现是 SDS(simple dynamic string),它是一个动态字符串结构,由长度、空闲空间和字节数组三部分组成。embstr:占用64Bytes的空间,存储44Bytes的数据raw:存储大于44Bytes的数据int:存储整数类型embstr和raw存储字符串数据,int存储整型数据。
2025-03-21 15:45:59
763
原创 (四)Redis的三种持久化策略及选取建议
RDB持久化策略是指在一定的时间间隔内,将Redis内存中的数据以二进制文件的形式保存到硬盘上。这个二进制文件就是一个快照,它记录了某个时刻Redis内存中的所有数据。RDB持久化策略可以通过配置文件或者命令来触发,配置文件中可以设置多个条件,当任意一个条件满足时,就会执行一次快照操作。save 900 1 # 900秒内执行一次 set 操作 则持久化1次save 300 10 # 300秒内执行10次 set 操作,则持久化1次。
2025-03-21 14:10:51
1048
原创 什么是 Docker?
Docker 使用 C/S 框架。客户端负责与 Docker 守护进程(Daemon) 进行对话,而守护进程负责繁重的构建、运行、分发 Docker 容器的工作。Docker 客户端和守护进程可以在同一操作系统中运行,或者通过客户端与远程的 Docker 守护进程进行连接。Docker 客户端和守护进程之间通过使用 REST 接口,基于 UNIX socket 或网络接口进行通信。另外还有一个 Docker 客户端叫作 Docker Compose,让你可以同时管理多个容器。
2025-03-17 11:35:05
856
原创 Java Concurrent 包
并发编程中通用的工具类。包括一些标准化,可扩展的小的实现结构(框架),和一些实用但却枯燥且不易实现的工具类。以下为主要组件的简易描述。另参考 java.util.concurrent.locks 和 java.util.atomic 包。
2025-03-16 02:03:43
844
原创 (五)缓存问题之缓存雪崩、缓存击穿和缓存穿透与布隆过滤器
缓存异常会面临的三个问题:缓存雪崩、击穿和穿透。其中,缓存雪崩和缓存击穿主要原因是数据不在缓存中,而导致大量请求访问了数据库,数据库压力骤增,容易引发一系列连锁反应,导致系统奔溃。不过,一旦数据被重新加载回缓存,应用又可以从缓存快速读取数据,不再继续访问数据库,数据库的压力也会瞬间降下来。因此,缓存雪崩和缓存击穿应对的方案比较类似。而缓存穿透主要原因是数据既不在缓存也不在数据库中。因此,缓存穿透与缓存雪崩、击穿应对的方案不太一样。
2025-03-11 20:54:38
741
原创 Java 中的死锁
这样虽然避免了循环等待,但是这种方法是比较低效的,资源的执行速度回变慢,并且可能在没有必要的情况下拒绝资源的访问,比如说,进程c想要申请资源1,如果资源1并没有被其他进程占有,此时将它分配个进程c是没有问题的,但是为了避免产生循环等待,该申请会被拒绝,这样就降低了资源的利用率。这样的话,资源的利用率会得到提高,也会减少进程的饥饿问题。释放已经保持的资源很有可能会导致进程之前的工作实效等,反复的申请和释放资源会导致进程的执行被无限的推迟,这不仅会延长进程的周转周期,还会影响系统的吞吐量。
2025-03-11 20:02:25
636
原创 spring-boot-starter-parent 项目的作用
当我们使用 Spring Initializr 创建 Spring Boot 项目时,发现总会继承一个 spring-boot-starter-parent 作用父类。假如不继承就不能用了吗?这个父类的作用是什么呢?在深入探究之前我们需要先了解一下 Maven 的继承特性。
2025-03-10 19:18:50
810
原创 序列化与反序列化
将对象持久化后,可以将其存储到磁盘或数据库中,以便后续读取和恢复对象的状态;在网络传输中,将对象序列化后,可以通过网络传递到远程节点,实现分布式系统间的通信和数据交互;:通过序列化,可以将对象转换成通用的格式,以便在不同平台、不同语言之间传递和交互;:通过序列化与反序列化,可以实现对象的尝试克隆,即创建一个与原对象完全相同的新对象。总结一下,序列化与反序列化就是在对象与特定格式(如二进制、JSON、XML等)之间转换的过程,可以实现数据持久化、数据传输以及跨平台和跨语言通信等功能。
2025-02-27 14:41:20
911
原创 Arch&Win10双磁盘双系统安装及相关知识
双磁盘安装Arch Linux 和 Windows 10,Winodws 10先于Arch安装,通过 Grub 引导。本文成功案例是在虚拟机(VMWare 14 pro)中实现,过程中出现的问题(如os-prober无法检测到 windows 系统)已解决,详见 Q&A 部分。
2022-01-27 11:10:25
5738
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人