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++的内容吧。 必要软件 为了正常使用所有功能,除了针对VSCode的配置,需要单独安装下列软件,并把路径添加到PATH Git CMake ninja 插件列表 首先列一下目前在VSCode上使用的,涉及到C++的核心插件: C/C++ (Microsoft):微软官方默认的C/C++插件,禁用了代码提示,但是调试这些还需要用它,不能完全禁用 clangd (LLVM):LLVM官方提供的,当前代码提示的主力插件 CMake Tools (Microsoft):微软官方提供的CMake支持,提供CMake命令工具条和快捷指令,以及CMake语法高亮 CodeLLDB (Vadim Chugunov):lldb调试支持,非官方支持 还有两个不太重要的插件: C/C++ Themes (Microsoft) Better C++ Syntax (Jeff Hykin) 补充:通过clangd (LLVM) 插件安装的clangd虽然是最新版本,但是代码修正功能可能有问题,还是直接使用系统中的clangd更加可靠。 C/C++ 插件和 clang...
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),每个作业都将在运行器机器上执行并运行一系列的一个或多个步骤(step),每个步骤...
GoogleTest + CTest 配置与使用
现在我们关注CMake项目中的测试部分,具体包括GoogleTest和CTest的使用。 概述 Google Test(简称为 gtest)是 Google 开发的一个开源的 C++ 测试框架,用于编写和运行单元测试、集成测试和功能测试。主要特点包括: 支持各种平台和编译器,包括 Linux、Windows 和 macOS,并且与主流的 C++ 编译器兼容。 提供了丰富的断言宏,如 EXPECT_EQ、ASSERT_TRUE 等,用于验证代码行为是否符合预期。 支持参数化测试,允许以不同的参数运行同一个测试用例。 可以生成详细的测试报告,包括测试通过的数量、失败的数量、失败的原因等信息。 可以扩展测试框架,编写自定义的测试扩展和断言宏。 CTest 是 CMake 附带的一个测试工具,用于管理和执行项目中的测试。它是一个命令行工具,可以通过简单的命令来执行测试,并生成测试报告。主要特点包括: 可以在构建系统中自动发现项目中的测试,并执行它们。 支持各种测试框架,包括 Google Test、Catch、Boost.Test 等。 可以通过简单的命令行选项来控制测试的执行,如...
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 博客部署与重建记录
我已经记不得这是第几次重建博客了,虽然基于git仓库的备份,所有的md文件都还在,但是node_modules以及其他的环境配置会因为各种各样的原因损坏(换电脑,系统重装,迁移系统等),有必要重新梳理一下博客搭建的过程。 下面的内容主要是在 Windows 和 Linux 上的本地部署,以及在云服务器和 Github Page 的远程部署,并不涉及具体的 Hexo 主题以及配置细节。 生成与部署逻辑 Hexo是一个基于NodeJS的静态博客框架。首先梳理一下主要的工作逻辑: 在本地博客文件夹中,下载必要的Hexo组件并配置 在source/_posts目录中添加博客文件(markdown 格式) 生成并推送 执行hexo generate生成相应的静态网页,生成的静态网页及相关资源都会存放在public/目录下 执行hexo deploy部署到远程仓库,实质上是将public/目录下的所有内容打包复制到一个git本地仓库,然后提交到指定的远程仓库 本地预览:执行hexo server启动本地预览(与public/目录无关),Hexo会在本地部署一个网站,通过 http://...
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}\author{Fenglielie...