XMake 速成笔记
虽然xmake的使用远没有cmake那么普及,cmake在可预见的将来都还是c++项目事实上的标准, 但是对于一些个人的小项目,直接使用xmake看起来还是更方便的,因此简单学习一下使用方式。 下载安装 虽然XMake支持了很多种安装方式,但是我还是选择了纯净版安装。 在Github仓库中选择xmake-[version]-win64.zip下载到本地解压,然后把对应路径添加到PATH环境变量即可。 Demo项目 xmake可以直接生成C++的HelloWorld项目 1xmake create -l c++ -P ./demo 这个命令会在当前位置下创建./demo文件夹,在其中自动生成如下文件结构 12345demo├── src│ └── main.cpp├── .gitignore└── xmake.lua 其中xmake的核心配置文件xmake.lua有效内容如下 12345add_rules("mode.debug", "mode.release")target("demo") ...
Lua 速成笔记——2. 进阶内容
元表 (Metatable) 元表(metatable)是 Lua 提供的一种机制,用于改变表(table)的行为。 通过对元表(metatable)的设置可以自定义表(table)的操作行为,如算术运算、索引等,甚至可以用来实现面向对象机制。 有两个涉及元表的操作函数: 使用setmetatable函数可以设置一个表的元表,第一个参数为目标的表,第二个参数为提供的元表,返回值是第一个参数,无论是否接收第一个参数,这里的修改都是有效的,因为传参过程相对于引用传递; 使用getmetatable函数可以获取一个表的元表,提供的参数就是目标的表。 运算符元方法 对于常见的运算符,有对应的元方法 __add 对应运算符 + __sub 对应运算符 - __mul 对应运算符 * __div 对应运算符 / __mod 对应运算符 % __unm 对应运算符 - __eq 对应运算符 == __lt 对应运算符 < __le 对应运算符 <= __concat 对应运算符 .. 例如用自定义的加法行为实现表的相加 1234567891011121314local...
Lua 速成笔记——1. 基础内容
简单学一下Lua这个有点过时的轻量级脚本语言吧,因为很多工具(nvim、xmake、MySQL等)都采用了Lua脚本提供配置, 而且直到现在,在c++项目使用Lua脚本提供配置也是一个可以考虑的方案。 关于Lua的教程很多都是速成版的,因为内容实在比较简单,比如Learn Lua in Y minutes。 编译安装 Lua是一种开源的脚本语言,完全使用C语言编写,Lua官网直接提供了源码, 在Linux系统中的下载和源码编译流程如下 1234curl -L -R -O https://www.lua.org/ftp/lua-5.4.7.tar.gztar zxf lua-5.4.7.tar.gzcd lua-5.4.7make all...
Cpp 智能指针
概述 C++标准库主要提供了三种智能指针:(都在<memory头文件中) shared_ptr:共享指针,允许资源共享,在内部维持一个引用计数,复制会增加引用计数,析构则会减少引用计数,引用计数为零则释放资源 unique_ptr:独享指针,独自负责资源的管理,析构时释放资源 weak_ptr:弱共享指针,作为共享指针的辅助手段,可以指向共享指针的内容但是不参与引用计数,主要为了解决共享指针的循环引用问题 除此之外,在早期还提供了auto_ptr,但是目前已经被废弃。下面先介绍RAII思想,然后介绍三种智能指针的使用。 简单示例与RAII 先给出使用原始指针和unique_ptr管理资源的对比示例 123456789101112131415{ int* p = new int(100); // ... delete p; // 必须记得手动释放内存}{ std::unique_ptr<int> up = std::make_unique<int>(200); //... //...
Cpp 多线程学习笔记——3. 原子操作
原子类型和原子操作 原子操作是指在多线程编程中对共享数据的操作是不可分割、不会被中断的操作, 这意味着操作不会被其他线程干扰,不会被调度切换,要么一次性执行完成,要么完全不执行,不存在第三种状态。 原子操作可以用于避免数据竞争和保证线程安全,不过显然我们需要为安全性付出额外的性能开销。 原子类型是一种特殊的数据类型,在底层保证对原子类型变量的相关操作是原子操作, 例如对原子类型变量的读取、写入、交换、递增、递减等。 这里我们再次重复前一篇使用的例子,只是改动了共享变量的定义:使用原子类型的整数变量shared_counter而非通常的整数变量 1234567891011121314151617181920212223242526272829303132333435363738#include <atomic>#include <iostream>#include <thread>#include <vector>const int num_threads = 5;const int num_increments =...
Cpp 多线程学习笔记——2. 互斥锁
线程安全与互斥锁 在多线程编程中,由于多个线程存在共享的资源(例如全局变量等),因此可能导致相互之间产生干扰, 下面的例子可以展示这种问题(必须使用Debug模式编译,因为Release模式下可能直接优化了) 12345678910111213141516171819202122232425262728293031323334353637#include <iostream>#include <thread>#include <vector>const int num_threads = 5;const int num_increments = 10000;const int num_experiments = 20;void increment_counter(int &counter) { for (int i = 0; i < num_increments; ++i) { counter++; // 多线程同时修改共享变量 }}void...
Cpp 设计模式笔记——7. 相关概念
除了设计模式,还有几个编程概念与之相生相随,尤其在Java中被广泛的应用:面向切面编程、控制反转和依赖注入。 下面简单学习一下这几个概念,并在C++/Python中尝试应用。 面向切面编程 面向切面编程(Aspect-Oriented Programming, AOP)是一种编程范式,它旨在提高软件模块化,通过将横切关注点(Cross-cutting Concerns)与业务逻辑分离来简化程序结构。 横切关注点是指那些分散在多个模块中的功能,如日志记录、事务管理、权限控制等,这些功能虽然对多个模块都重要,但与核心业务逻辑无关。 在Java中,Spring框架广泛支持AOP,例如我们可以使用Spring AOP来添加日志记录的切面,主要代码如下 1234567@Aspectpublic class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { ...