Cpp std::format 学习笔记
已经2024年了,C++20标准正式收编fmtlib得到的格式化方案std::format已经被三大编译器支持得很好了, 虽然部分特性在后续的标准中仍然在改进,但是值得好好学习整理一下了。 std::format在形式上和Python的字符串格式化非常类似,对用户很友好。当然由于Python自身是动态的,f-string可以玩得花样更多,写起来更方便,这是C++无论如何也比不了的。 简单示例 从HelloWorld开始 12345678#include <format>#include <iostream>int main() { std::string str = std::format("Hello, {}!", "World"); std::cout << str << '\n'; return 0;} 主要是用来测试编译器支持的,编译器版本不能太低,并且还需要加入-std=c++20之类的选项,确保编译器...
VSCode Cpp 配置
记录一下目前在VSCode配置C++的内容。 需要说明的是,本文中的配置方案不适合小白,配置比较复杂: 使用 clangd 替换了微软官方的 Cpp 插件 深度结合 CMake 使用 不依赖 VSCode 的 tasks.json 支持多种编译环境 一种更简单的配置方案是基于 Code Runner 插件和 tasks.json 实现的,但是缺点是无法应用于复杂项目中,只适合单个源文件的简单情况,比如 C++ 的简单练习。 必要软件 为了正常使用所有功能,除了针对VSCode的配置,需要单独安装下列软件,并把路径添加到PATH Git CMake ninja 插件列表 首先列一下目前在VSCode上使用的,涉及到C++的核心插件: C/C++ (Microsoft):微软官方默认的C/C++插件,禁用了代码提示,但是调试这些还需要用它,不能完全禁用 clangd (LLVM):LLVM官方提供的,当前代码提示的主力插件 CMake Tools (Microsoft):微软官方提供的CMake支持,提供CMake命令工具条和快捷指令,以及CMake语法高亮 CodeLLD...
Cpp 编译环境笔记
整理一下关于C++编译器的笔记,这部分由于不是科班出身,没学过编译原理之类的课程,细节总是搞不懂, 本文只是基于网络搜集到的各种零散的描述进行整理,不保证正确性!!! 在本文中只关注x64平台,Windows或Linux(Ubuntu)系统的C/C++编译环境,并且不考虑交叉编译等问题。 除了系统原生的MSVC和GCC,重点关注两个概念: MinGW,MinGW-W64,MSYS... LLVM,clang 将它们并列是不合适的,因为它们不是一个层面上的东西,但是这两个确实是我在理解C++编译环境配置时遇到的最大困难。 基本概念 c 语言的标准分成两部分: 语法,指导我们应该怎么编程,在源文件中必须满足某些规则 标准库(头文件),相对于系统层面向 c 语言程序提供的一些基础接口,例如printf等,但语法标准只是规定了接口的形式,并没有具体的实现 对 c 语言的支持,也分成两个部分: c 编译器,从源代码得到可执行文件和库文件 c 标准库的具体实现,以库文件的形式提供最基础的功能(以及对应的头文件),供其他程序使用 由于Liunx系统和Windows系统都是基于c/c...
Cpp 日志库 spdlog 配置与使用
整理一下关于C++项目中日志库的学习,在之前曾经陆续实现过几次较为简单的日志工具, 但是在编程逐步正式化之后,自己造这种基础的轮子还是没必要的,采用成熟的spdlog日志库比较合适。 概述 spdlog是一个快速的、跨平台的C++日志库,它提供了简单易用的API,支持多种日志级别、多线程安全、异步日志写入等功能。 它具有灵活的配置选项,允许开发者根据需要自定义日志记录行为,支持日志文件的轮换和分割等常见功能。 因为spdlog的使用简单直观,文档齐全,社区活跃,它已经成为当前最常用的C++日志记录工具之一。 spdlog对使用者非常友好: 可以作为纯头文件库使用,直接复制到项目中 可以在编译安装后通过CMake导入 可以将源码直接放在项目文件夹下,作为CMake子项目添加并使用(作为头文件库或二进制库均可) spdlog更推荐通过编译使用,因为可以节约整体的编译时间,否则每次编译时spdlog也要占用相当的时间,可能是用了大量模板的原因。在导入spdlog的头文件时,采用按需取用的策略,而不是某些库采用的只需要include一个万能头文件即可。 spdlog依赖fmtli...
Github workflow 学习笔记
学习一下 Github 仓库的工作流语法,希望在 Github 仓库中自动执行测试。 重点关注两类项目所需要的基本测试工作流,分别是跨平台 CMake 项目和 LaTeX 项目。 概述 Github 仓库提供工作流来自动化执行应用的部署,测试和发布等流程。工作流的实质是在 Github 服务器上提供了几个临时的虚拟环境(Docker),让用户在提交或其他 Git 行为后触发工作流,然后在虚拟机环境中自动执行相关的指令。 例如,可以使用一个工作流来构建和测试拉取请求,使用另一个工作流在每次创建版本时部署应用程序, 还有另一个工作流程在每次有人打开新问题时添加标签。 注意: Github 仓库支持多个工作流,它们可以同时触发或分别触发。 Github 对公开仓库提供的这类服务是无限制的,但是对私有仓库是受限的,每个月提供免费的时间额度和存储额度,超额需要付费。 如果在仓库中触发的一个工作流运行失败了,Github 可能通过邮件通知。 一个典型的工作流(workflow)包含: 触发工作流的一个或多个事件 一个或多个作业(job),每个作业都将在运行器机器上执行并运行一系列的一个...
Cpp 单元测试:GoogleTest + CTest 配置与使用
现在我们关注CMake项目中的测试部分,具体包括GoogleTest和CTest的使用。 概述 Google Test(简称为 gtest)是 Google 开发的一个开源的 C++ 测试框架,用于编写和运行单元测试、集成测试和功能测试。主要特点包括: 支持各种平台和编译器,包括 Linux、Windows 和 macOS,并且与主流的 C++ 编译器兼容。 提供了丰富的断言宏,如 EXPECT_EQ、ASSERT_TRUE 等,用于验证代码行为是否符合预期。 支持参数化测试,允许以不同的参数运行同一个测试用例。 可以生成详细的测试报告,包括测试通过的数量、失败的数量、失败的原因等信息。 可以扩展测试框架,编写自定义的测试扩展和断言宏。 除了 Google Test,Catch2 也是一个相对主流的 C++ 测试框架,Catch2 还是一个 header-only 的单文件库。 通常无法对可执行文件进行单元测试,如果需要测试的目标可执行文件,一个建议的做法是把核心逻辑全部写成一个静态库文件,可执行文件仅仅作为库文件的简单包装,然后对库进行测试。(例如 CPython 作...
CUDA学习笔记——入门例子
虽然配置CUDA的目的主要是支持PyTorch的机器学习,但是如果需要直接手写CUDA代码,并在Windows上使用nvcc顺利编译和执行纯CUDA程序,还需要Visual Studio相关工具的支持。(MINGW似乎不太行,或者说鼓捣起来太麻烦,Windows中的nvcc默认是配合MSVC进行编译的) 鉴于我在电脑上安装了VS2022,并且CUDA自动给VS2022加了插件适配,因此尝试学一点CUDA,并写几个简单的HelloWorld程序。 基本概念 CUDA编程模型是一个异构模型,需要CPU和GPU协同工作,通常CPU负责处理逻辑复杂的串行程序,而GPU重点处理数据密集型的并行计算程序,从而发挥最大功效。 在CUDA中,用host指代CPU及其内存,用device指代GPU及显存。CUDA程序中既包含host程序,又包含device程序,它们分别在CPU和GPU上运行。 host与device之间可以进行通信,在它们之间通信需要进行数据拷贝。 一个典型的CUDA程序的计算流程如下: 分配host内存,并进行数据初始化; 分配device显存,并从host将数据拷贝到dev...
CUDA学习笔记——基本概念与CUDA下载
显卡 显卡(Graphics card),全称显示接口卡,又称显示适配器,是计算机的重要硬件组件之一,负责图形处理和显示输出。显卡通常由 GPU(图形处理器)、显存、供电模块等部分组成。类似的扩展设备还有网卡、声卡等。显卡的主要功能是将计算机内部处理的数字信号转换为显示器可识别的图像信号,从而驱动屏幕显示内容。 早期显卡多集成在主板上,仅承担基础的视频输出功能,并不负责复杂的图形计算。随着技术发展,出现了独立显卡和集成显卡的区分: 集成显卡:集成在 CPU 或主板芯片组中,依赖系统内存(RAM)作为显存,无法单独更换。适用于轻量办公和日常使用。 独立显卡:作为独立硬件插入主板的 PCIe 插槽,拥有专用显存和更强的计算能力,可随时更换升级。独立显卡在图形渲染、视频处理、科学计算等任务中表现更优。 现代笔记本通常配备双显卡:一个集成显卡(低功耗)和一个独立显卡(高性能)。系统可根据任务需求自动切换,以平衡性能和能耗。轻薄本可能仅配集成显卡以延长续航,而游戏本、工作站则倾向于搭载性能优先的独立显卡。 显卡驱动 显卡作为硬件设备,需要在操作系统中安装正确的显卡驱动程序以正常运行。显...
Hexo 博客部署与重建记录
记录一下 Hexo 的完整部署流程,并不涉及具体的 Hexo 主题以及配置细节。 生成与部署逻辑 Hexo 是一个基于 NodeJS 的静态博客框架。首先梳理一下主要的工作逻辑: 在本地博客文件夹中,下载必要的 Hexo 组件并配置。 本地预览:执行 hexo server 启动本地预览,Hexo 会在本地开启一个网站,通过 http://localhost:4000 访问。 在 source/_posts 目录中添加或修改博客文件(markdown 格式)。 执行 hexo generate 生成静态网页,生成的静态网页及相关的所有资源都会存放在 public/ 目录下。 执行 hexo clean 清理本地缓存(包括 public/ 和 db.json 文件等),这种做法可以有效避免一些错误。 部署: 如果安装了第三方部署插件,可以执行 hexo deploy 部署到远程仓库,实质上是将 public/ 目录下的所有内容打包复制到一个 git 本地仓库,然后提交到指定的远程仓库 也可以用其它任意方式,把 public/ 目录打包复制到网站对应的目录下即可。 日常写博客...
LaTeX Beamer 笔记
系统地整理一下 Beamer 的笔记,之前的使用只是基于某个模板的临时使用,当前的目标是整理一个简洁的自用 Beamer 模板。 注意到 Beamer 虽然属于LaTeX的一部分,但是与标准的 LaTeX 文档有很多的不同,部分 LaTeX 宏包和命令可能无法在 Beamer 上呈现正常的效果,这也意味着 Beamer 的编译错误更难改正。 笔记主要参考 latex-beamer.com 的英文在线教程和若干博客。 当前模板的两种风格效果如下图,模板存放在Github仓库:latexzero。 极简示例 从一个最简单的例子开始 1234567891011121314151617181920212223\documentclass{beamer}% Theme choice:\usetheme{AnnArbor}% Title page details:\title{My First \LaTeX{} Presentation}\subtitle{A subtitle}\auth...
