
C++
文章平均质量分 74
joker D888
计算机专业研一,喜爱linux C++ ,借用博客来记录笔记,整理记录,与大家一起分享知识。
人一辈子,没有人能打败你,只有你自己打败你自己。过去不可追,未来却可期。那么,一切就从现在开始。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++ Filesystem Library 全解
C++ Filesystem库提供了完整的文件系统操作功能,包括路径处理(path类)、目录遍历(directory_iterator)、文件状态查询(file_status)、权限管理(perms)等核心组件。该库支持路径拼接、递归遍历目录、获取磁盘空间(space_info)、处理文件系统异常(filesystem_error)等功能。主要特点包括:跨平台的路径处理、支持UTF-8编码、提供异常和错误码两种错误处理机制,以及高效的文件状态缓存机制(directory_entry)。该库自C++17起成为原创 2025-07-15 20:59:41 · 428 阅读 · 0 评论 -
C++20 协程参考手册详解 - 源自 cppreference.com
先说“人说”,简化版本,更易理解。宏观概念:协程是一个可以暂定和恢复执行的函数。(普通函数是线程相关的,函数的调用依赖于线程栈,而协程的运行状态暂定状态保存在堆区,协程在线程A暂停后,后续可以在另一个线程B继续上次的状态执行。)具体的:在C++中,只要函数出现了,或这三个关键字之一,函数就由编译器变为协程。的作用是让协程“暂停一下”,等待某个操作(比如网络请求或文件读取)完成后,再继续执行。就是这个“等一等”的动作,暂停协程,干别的事,等条件满足再回来。但问题来了:如果你直接对一个自定义类型用,比如,编译器原创 2025-07-15 20:58:42 · 1212 阅读 · 0 评论 -
【C++】深入理解 unordered 容器、布隆过滤器与分布式一致性哈希
本文深入探讨了C++中的unordered容器、布隆过滤器和分布式一致性哈希的原理、实现及应用场景。unordered容器基于哈希表,提供O(1)的查询、插入和删除操作,通过链表法或开放寻址法处理哈希冲突。布隆过滤器是一种概率型数据结构,用于判断元素是否存在,具有高效和节省空间的特点,但存在误判且不支持删除。一致性哈希则用于解决分布式系统中的数据迁移问题,通过虚拟节点优化负载均衡。这些技术在数据结构优化、缓存设计和分布式架构中发挥着重要作用。原创 2025-05-13 18:30:48 · 1291 阅读 · 0 评论 -
【C++】流(Stream)详解:标准流、文件流和字符串流
标准流:处理基本的控制台输入输出文件流:读写文件数据字符串流:在内存中处理字符串数据理解这些流的概念和用法对于C++编程至关重要,它们不仅提供了统一的操作接口,还能帮助我们编写更清晰、更健壮的代码。原创 2025-05-13 18:30:01 · 1189 阅读 · 0 评论 -
【CUDA】mnist_cuda
使用MLP进行手写数字识别,分别使用pytorch,numpy,cuda一步一步展开代码的具体实现细节。平常使用的pytorch实现,实现了对底层细节的良好封装,易于编程,利于模型的快速搭建。根据nn.CrossEntropyLoss()的计算公式,,计算大约为,最开始参数随机初始化,接近于随机猜测。numpy则进一步对模型的内部进行展开,除了基本的操作,模型的结构,网络的前向传播和方向传播等都需要手动实现。cpu版仅使用C语言搭建整个训练过程,训练的整个流程,模型的构建、计算、前向传播、反向传播、原创 2025-03-26 21:53:05 · 307 阅读 · 0 评论 -
【CUDA】CUDA Hierarchy
首先简单介绍CUDA 编程的基本概念:讲解 Host(CPU)与 Device(GPU)的区别、内存管理以及 CUDA 运行时的工作机制。显存分配: 使用 在显存中分配内存。内存拷贝: 使用 在 Host 和 Device 间传输数据:释放显存: 使用 释放分配的显存。CUDA 编译器(nvcc)Host 代码:被修改以支持 CUDA 内核。编译为普通的 x86 二进制。Device 代码:编译为 PTX(并行线程执行)代码。PTX 是跨 GPU 代的稳定中间表示,原创 2024-12-03 21:39:33 · 1149 阅读 · 0 评论 -
【MPI】组和通信器
在 MPI 中,通讯器是一个逻辑上分组的进程集合,它用于标识一组可以彼此通信的进程。一个通讯器不仅仅是进程的集合,它还具有一个上下文(context),用于区分同样的操作在不同通讯器中的执行。通过通讯器,MPI 可以确保不同组的进程之间的消息传递不会发生冲突。例如,默认通讯器包含了所有启动 MPI 程序的进程,而在某些应用中,我们可能只关心其中一部分进程之间的通信。原创 2024-11-19 18:40:31 · 1074 阅读 · 0 评论 -
【CUDA】Optimize Matrix Multiplication
参考:Simon Boehm’s blog & git repo。链接文章写的很好,本文主要是学习重点记录。首先本文的主要内容是将从一个朴素的内核开始,然后逐步应用优化(This includes coalescing global memory accesses, shared memory caching and occupancy optimizations, among others.),直到我们将 cuBLAS (NVIDIA 的官方矩阵库)的性能控制在 95% 以内。首先文章是基于A6000GP原创 2025-02-11 21:08:07 · 1198 阅读 · 0 评论 -
【CUDA】Pytorch_Extensions
对于计算密集型的操作(如神经网络中的自定义激活函数),使用CUDA扩展可以获得接近硬件极限的性能。本文将以实现一个多项式激活函数x² + x + 1为例,展示完整的开发流程。原创 2025-02-16 14:46:10 · 1235 阅读 · 0 评论 -
【MPI】 六大金刚:六个最基本、最常用的函数
首先,安装MPI看。先简要介绍一下rank(进程序号)和。原创 2024-11-12 12:59:29 · 1638 阅读 · 0 评论 -
【MPI】基础集体通信
同步用于同步所有进程。广播MPI_Bcast将数据从一个进程广播给所有其他进程。分发将数据从根进程分发给所有进程。聚集MPI_Gather将所有进程的数据收集到根进程。全收集将每个进程的数据收集并分发给所有进程。这些操作通常用于并行计算中,帮助在多个进程之间高效地共享数据和同步。原创 2024-11-15 18:33:35 · 1258 阅读 · 0 评论 -
【CUDA】CUBLAS
【CUDA】CUBLAS在深入了解之前,提前运行预热(warmup)和基准测试(benchmark runs) 是获得准确执行时间的关键。如果不进行预热运行,cuBLAS 的首次运行会有较大的开销(大约 45 毫秒),会导致结果偏差。基准测试能够更准确地计算出平均执行时间。cuBLAS:CUDA 基本线性代数子程序库简介:cuBLAS 是 NVIDIA 的 GPU 加速线性代数运算库,广泛应用于 人工智能(AI) 和 高性能计算(HPC) 领域。功能:提供了行业标准的 BLAS 和 GEMM(矩原创 2024-12-14 21:14:22 · 1542 阅读 · 0 评论 -
【CUDA】Triton
CUDA是一种低级 GPU 编程框架,程序员需要自己处理线程调度、内存访问等底层优化细节。Triton提供了一个更高层次的抽象,简化了深度学习 GPU 编程,让程序员能够专注于算法层次的开发,而不需要担心低级硬件细节。Triton 是建立在 CUDA 基础之上的,因此了解 CUDA 的基本概念对深入理解 Triton 及其性能优化非常重要。原创 2025-02-16 14:44:53 · 1620 阅读 · 0 评论 -
【MPI】高级集体通信
MPI_Reduce: 将多个进程的数据汇总到一个特定的进程(通常是 root 进程)。: 将多个进程的数据汇总,并将结果发送到所有进程。MPI_Reduce适用于只关心一个进程获得汇总结果的场景,而适用于需要所有进程获取汇总结果的情况。原创 2024-11-19 18:39:33 · 664 阅读 · 0 评论 -
【CUDA】cuDNN:加速深度学习的核心库
【CUDA】cuDNN:加速深度学习的核心库1. 什么是 cuDNN?cuDNN(CUDA Deep Neural Network library)是 NVIDIA 提供的一个高性能 GPU 加速库,专为深度学习任务中常见的操作进行了高度优化。它不仅提供了单操作的高效实现,还支持 多操作融合(fusion),旨在最大化地利用 NVIDIA GPU 的计算能力。cuDNN 能做什么?cuDNN 支持以下常见深度学习操作:卷积操作(Convolution forward/backward,包括交叉相原创 2024-12-27 20:23:18 · 2867 阅读 · 0 评论 -
【MPI】阻塞点对点通信
本文将介绍 MPI 中的阻塞式点对点通信,包括基本数据类型、MPI_Send和MPI_Recv函数、MPI_Status结构体,以及和MPI_Probe函数。原创 2024-11-12 13:00:28 · 567 阅读 · 0 评论 -
【CUDA】Kernel & Atomic & Stream
在 CUDA 编程中,线程同步是极为关键的环节。()函数的作用在于确保针对都完成后,才安全地开始下一个操作。可以将其看作是一个屏障。它通常在或者其他非__global__函数中被调用。由于 GPU 线程是异步执行的,它们的执行顺序并不确定。例如在一些复杂的计算流程中,如果后续的计算依赖于前面内核操作的结果,那么使用这个函数就能避免在前面结果还未就绪时就开始后续操作,从而防止错误的产生。则是用于在。当多个线程可能会对相同的内存位置进行操作时,就需要使用它。原创 2024-12-03 21:40:37 · 1311 阅读 · 0 评论 -
【C++】剖析lower_bound & upper_bound
先看看接口。原创 2024-12-27 20:25:19 · 468 阅读 · 0 评论 -
程序编译过程及makefile依赖
预处理器处理源代码中的预处理指令,如宏定义 ()、文件包含 ()、条件编译指令 (, , ) 等。预处理的输出是纯C/C++代码,不再包含任何预处理指令。预处理的命令通常是:2. 编译 (Compilation)编译器将预处理后的代码转换为汇编代码。这个过程中,编译器会进行语法检查、语义分析、优化代码等。编译的输出是汇编代码文件。编译的命令通常是:3. 汇编 (Assembly)汇编器将汇编代码转换为目标机器码 (Object Code),生成目标文件。这些目标文件是二进制格式的,但还不是可执行文件原创 2024-08-13 16:43:52 · 481 阅读 · 0 评论 -
c++ %运算符
运算符%俗称“取余”或“取模”运算符,负责计算两个整数相除所得的余数。在除法运算中,如果两个运算对象的符号相同则商为正(如果不为0的话),否则商为负。C++语言的早期版本允许结果为负值的商向上或向下取整,。根据取余运算的定义,如果m和n是整数且n非0,则表达式的求值结果与m相等。隐含的意思是,如果m%n不等于0,则它的符号和m相同。C++语言的早期版本允许m%n的符号匹配n的符号,而且商向负无穷一侧取整,这一方式在新标准中已经被禁止使用了。原创 2024-02-17 15:04:20 · 2546 阅读 · 1 评论 -
C/C++输出输出相关问题
3)除了scanf(“%c”),scanf有一个特性——忽略先导的空白符,只要他们连续的出现在缓冲区的开头,不管有多少个连续的空白符,scanf都会把其读走并丢弃,直到遇到非空白符,再读入有意义的字符;4)读取字符串(字符数组)的时候,比如读aaa\n,你读入字符串最后会带有\n,这个\n并不是你输入的\n,而是编译器自己添加的,你自己输入的\n还留在缓冲区中。是C/C++中的一个标准库函数,用于从标准输入(通常是键盘)读取一个字符,并返回读取的字符,如果读取失败或到达了文件尾,就返回。原创 2024-02-17 11:35:24 · 793 阅读 · 0 评论 -
C++ transform算法中toupper的使用
用到这样一个函数,将小写字符串转为大写。原创 2024-01-27 15:29:52 · 1748 阅读 · 0 评论 -
命名强制类型转换
在上面的所有形式中,e的类型必须符合以下三个条件中的任意一个:e的类型是目标e的公有派生类、e的类型是目标tpe的公有基类或者e的类型就是目标bpe的类型。也就是说,强制转换的结果将与原始的地址值相等,因此我们必须确保转换后所得的类型就是指针所指的类型。通常为运算对象的位模式提供较低层次上的重新解释,用于进行底层的、不安全的类型转换,通常用于指针或引用之间的转换,以及整数和指针之间的转换。主要用于编译时的类型转换,它通常用于类层次结构中的相关类型、基本数据类型之间的转换以及一些隐式类型转换的显式表示。原创 2024-01-25 23:01:07 · 892 阅读 · 0 评论 -
priority_queue比较规则
在C++中,的默认行为是生成大根堆。如果想要生成小根堆,可以使用构造函数的第三个参数,传入一个自定义的比较函数。对于类型为然后在定义//我们定义了一个小根堆,堆的元素是pair类型的,使用自定义的比较函数cmp对元素进行排序。// 当然也可以使用lambda。原创 2024-01-11 15:11:50 · 719 阅读 · 0 评论 -
MySQL C API的使用
MySQL C API(也称为 MySQL Connector/C)是用于与 MySQL 数据库交互的 C 语言 API。它提供了一组函数和结构体,允许你在 C 程序中连接到 MySQL 数据库服务器,并执行查询、插入、更新等数据库操作。原创 2024-01-08 14:27:38 · 1132 阅读 · 2 评论 -
ctemplate的使用
CTemplate是一种简单但功能强大的模板引擎,它是Google制作的一个开源C++库,广泛用于各种HTML模板解析和生成。CTemplate的主要优点是简单和灵活。它将模板和逻辑分开,使得页面布局和细节(HTML)与控制流、条件等逻辑分离,使软件的维护和修改变得更容易。:模板文件是普通的文件,比如一个HTML文件。在你想插入变量的地方使用的形式。例如,在一个HTML模板中,你可以写</</:首先,你需要创建一个的实例,并为其添加变量。:最后,你可以将填充了数据的对象和模板文件放入。原创 2024-01-08 13:57:52 · 838 阅读 · 0 评论 -
静态库和动态库的生成和编译
静态库和动态库是两种不同的代码库,它们之间的区别主要在于如何链接和加载代码。静态库是一组目标文件(Object File)的集合,它们被打包成一个单独的文件。在编译时,静态库的代码被复制到可执行文件中,使得可执行文件包含了所有需要的代码。因此,静态库在链接时会增加可执行文件的大小,但是可以避免对库的依赖性。每次修改静态库的源代码,都需要重新编译整个可执行文件。动态库也是一组目标文件的集合,但是它们被打包成一个单独的共享库文件,扩展名为.so(Linux) 或 .dll(Windows)。原创 2023-02-22 22:20:30 · 918 阅读 · 0 评论 -
java中的接口用C++怎么理解
看设计模式时,书中以java举例,其中使用了java的接口,但本人却是C++选手,对java也不了解,故此文来学习理解。原创 2023-02-18 14:30:00 · 442 阅读 · 0 评论 -
C++ MySQL Error 1366 incorrect string value引发的认识
在使用MySQL C++ API编写程序时,由于用到了中文,导致出现了MySQL error 1366 incorrect string value 问题,但令我同样不解的是我用同样的语句在cmd下可以正常执行。(MySQK1366 报错如下如下:虽然可以很容易发现时字符集编码的问题,也确实是这个问题,这也是第一次编写程序遇到,虽然找问题解决方法很痛苦,但对字符集编码以及跨平台有了更深的了解。原创 2022-12-11 08:15:00 · 754 阅读 · 0 评论 -
关于整数原反补的一些认识
计算机中存储的数据都是以补码的形式存储的,计算机中的整数有无符号数和有符号数之分。最常见的有符号数的计算机表示方式就是补码形式,其次还有原码和反码两种表示形式,之所以会有不同的表示形式,是由于各自的解释方式不同。无符号数只有唯一的解释方法。因为正数按照上述的表示方法形成的二进制结果都相同,所以称正数的原反补相同,并不是特殊规定。如果你疑惑正数的原反补为什么相同,那大概你会查到“规定正数的原反补相同”这样的字眼。但其实只要了解原反补码的表示方法就一目了然了。所以为什么计算机要采用补码呢?原创 2022-09-30 08:00:00 · 367 阅读 · 7 评论 -
C++ 查找指定目录下的文件数
C++ 查找指定目录下的文件数代码#include<iostream>using namespace std;#include <filesystem>#include <string>using namespace std::filesystem;// 注意这个函数也会统计隐藏文件int getFileNumber(string folderPath) { if (!exists(folderPath)) // 如果目录不存在原创 2022-05-19 10:31:49 · 3398 阅读 · 3 评论 -
C++ 批量修改文件名
C++ 批量修改文件名前言在网上下一些学习资料,可是每个文件后带有一些其他无关的文字,形式如,某某某【某某某】.mp4,其中【】及其内容皆为无关内容,本文代码程序用于批量删除每个MP4文件后的【某某某】。注意文件名即为中文字符,不同于英文格式,所以以下代码中在需要的时候都使用了宽字符处理。代码#include <iostream>#include <string>#include <vector>#include <io.h>int mai原创 2022-05-09 16:47:39 · 3056 阅读 · 2 评论 -
二级指针及函数传参和形参问题
二级指针及函数传参和形参问题问题描述在帮助解决小伙伴的问题中,发现对二级指针的理解更上一层,其问题为自建链表的初始化失败,简单描述如下typedef struct LNode { int data; struct LNode* next;}LNode, * LinkList;//初始化单链表 (LinkList是指针类型)void InitList_L(LinkList L1){ L1 = (LinkList)malloc(sizeof(LNode)); L1->next = N原创 2022-03-19 19:26:52 · 1225 阅读 · 4 评论 -
【c++】头文件互相包含问题
头文件相互包含转载 2022-02-02 16:50:14 · 613 阅读 · 0 评论 -
为何string调用swap导致迭代器失效
为何string调用swap导致迭代器失效前言swap操作交换两个相同类型的容器的内容,一般的容器(除array外),交换两个容器内容的操作会保证非常快,因为并没有交换元素本身,而只是交换了两个容器的内部数据结构(string不一定)。注:这里交换两个容器的内部数据结构是指交换容器中各元素的内存地址,并不是交换各个元素变量所存储的值。除string外,swap使用之后指向容器的指针、引用和迭代器均有效(即开始指向那个元素,在swap之后这个指针、引用和迭代器依然指向该元素)。除array外,swa原创 2022-01-11 13:17:02 · 1372 阅读 · 0 评论 -
scanf(%d),连续输入数字和字符(一条无空格字符串)
scanf(%d),连续输入数字和字符(一条无空格字符串)scanf("%d"),如果缓存区的开始是数字,scanf会读入,直到遇见非数字字符,否则不会读入#include<iostream>using namespace std;int main(){ int a[100]; char c[100]; for (int i = 0; i < 5; ++i) { //一次输入1a2b3c4d5e,scanf(%d)只有一开始遇见数字才能把数字读走,%d会读入数字,直到遇见字原创 2021-12-08 15:36:53 · 3043 阅读 · 0 评论 -
二维数组传参,用int指针接收
二维数组传参,用int*接收前言//我们直到二维数组的数组名是一个地址,等于arr[0][0],即通过值来看,arr=&arr[0][0]//而下方的Print函数调用,传递的参数却是&arr[0][0],疑问来了,直接传数组名可以吗?(一维数组可以)#include<stdio.h>void Print(int* arr) { for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) {原创 2021-12-01 23:11:19 · 1116 阅读 · 0 评论 -
“非常量引用的初始值必须为左值“及“匿名对象“
“非常量引用的初始值必须为左值"及"匿名对象”前言在练习的时候用引用接收匿名对象引发”非常量引用的初始值必须为左值“错误简单还原如下#include<iostream>using namespace std;class Maker {public: Maker() { cout << "Maker的构造" << endl; } Maker(const Maker& m) { cout << "Maker的拷贝构造" &原创 2021-11-26 10:45:19 · 1009 阅读 · 2 评论 -
“异常对象的生命周期”及“匿名对象抛出和引用接收的最优操作”
“异常对象的生命周期”及“匿名对象抛出和引用接收的最优操作”主题讨论异常中对象的生命周期,以及最优的异常接受方式#include<iostream>using namespace std;class Maker {public: Maker() { cout << "Maker的构造" << endl; } Maker(const Maker& m) { cout << "Maker的拷贝构造" << endl原创 2021-11-25 21:13:09 · 492 阅读 · 0 评论 -
scanf(“%d\n“)多余输入问题及\n的读入问题
scanf("%d\n")多余输入问题及\n的读入问题前言原问题是想在输入数字后把缓冲区的\n也读走,以方便后续的字符串输入工作,而这样想要scanf("%d\n")直接读走\n引发的问题引起了我的思考,虽然知道这样做不行,但想要之所以然,于是此博文诞生,问题简化如下。#include<stdio.h>int main(void){ int a; scanf("%d\n", &a); return 0;}//比如输入1\n2\n后程序方可结束一个简单的输入问题,本原创 2021-10-25 15:45:23 · 3770 阅读 · 3 评论