
C++编程实战大杂烩
文章平均质量分 86
C++的设备驱动能力和性能 + web框架的渲染与业务能力可以构架出更有效率的软件
本专栏会提到下面内容:
1. C++的基本内容,这是基础。包括标准库,windows的SDK等。
2. 通用的web级C++框架,如CEF,Electron等
3. 兼容C++的服务,如nodejs等。
优惠券已抵扣
余额抵扣
还需支付
¥49.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
新兴AI民工
人工智能行业的新兴民工
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CUDA编程模型中的线程模型
本文介绍了CUDA编程中的线程模型,包括逻辑模型和物理模型。在逻辑模型中,kernel执行对应grid,包含block和thread两个层级,通过<<<>>>指定形状参数。物理模型涉及GPU硬件执行单元SM(流式多处理器)的运作机制,SM采用SIMT架构以32线程的warp为基本执行单元。文章强调block大小应设为32的倍数以适配硬件特性,并提供了设备信息查询代码示例,说明不同grid/block配置对性能的影响。CUDA驱动负责将逻辑线程模型映射到物理设备上进行调度执原创 2025-07-03 17:52:48 · 41 阅读 · 0 评论 -
使用Visual Studio 2022创建CUDA编程项目
本文介绍了在Visual Studio 2022中配置CUDA开发环境的完整流程。首先需要安装VS2022并勾选C++开发组件,然后安装CUDA Toolkit和兼容的NVIDIA驱动。创建项目时选择CUDA模板,VS会自动生成数组相加的示例代码。项目配置包含CUDA头文件依赖和链接器设置(cudart_static.lib)。文章详细说明了从环境搭建到代码编写、调试的完整步骤,帮助开发者快速上手CUDA编程。原创 2025-07-03 17:51:52 · 320 阅读 · 0 评论 -
系统级编程(六):windows编程:LIB和OBJ格式文件解析
在C++编程中,目标文件(OBJ)和静态库文件(LIB)是编译过程中的重要组成部分。OBJ文件采用COFF(Common Object File Format)格式,而PE文件(如EXE和DLL)是COFF的扩展。COFF文件结构包括文件头、节表、符号表和字符串表。通过定义相应的结构体,可以解析OBJ文件的内容。例如,使用CoffFileHeader结构体读取文件头,SymbolTableEntry结构体读取符号表。然而,在读取符号表时,由于内存对齐问题,实际读取的字节数与文件中的字节数可能不一致,需要手动原创 2025-05-16 17:55:30 · 176 阅读 · 0 评论 -
系统级编程(五):windows编程中加载DLL的两种典型方式的比较
在Windows编程中,集成DLL的两种主要方式是在IDE中直接调用和使用系统API LoadLibrary动态加载。直接调用会在exe文件的导入表中写入依赖信息,导致程序启动时检查DLL依赖,而LoadLibrary则不会。此外,LoadLibrary方式无法直接使用DLL中的类,需要通过工厂函数创建类实例。直接调用方式在IDE中可能对函数命名进行了转换,而LoadLibrary需要显式使用extern "C"来避免名称修饰问题。通过代码示例展示了两种方式的实现及其导入表依赖的差异,并原创 2025-05-16 17:54:36 · 233 阅读 · 0 评论 -
系统级编程(四):利用windows API使用操作系统剪切板
剪切板是操作系统提供的一种内存空间,用于在进程之间传递数据。通过系统级编程,可以实现对剪切板的基本操作,如写入和读取数据。写入剪切板时,首先需要打开剪切板,清空其内容,然后将数据复制到全局内存中,并设置剪切板数据类型(如CF_TEXT)。读取剪切板时,打开剪切板后检查数据类型,获取数据并输出。此外,还可以通过自定义数据类型(如999)传递复杂的数据结构,如自定义的结构体。需要注意的是,如果结构体中包含指针,必须进行深度复制,否则在其他进程中访问该指针会导致崩溃。原创 2025-05-10 11:56:54 · 118 阅读 · 0 评论 -
系统级编程(三):通过读取PE文件获取EXE或者DLL的依赖的另一种办法
本文介绍了如何通过Windows API将PE文件映射到内存中,以快速获取其导入表信息。首先,使用CreateFile和CreateFileMapping将文件加载到内存,并通过MapViewOfFile获取内存首地址。然后,通过指针操作解析PE文件结构,将相对虚拟地址(RVA)转换为文件偏移,定位并读取导入表。最终,通过UnmapViewOfFile和CloseHandle释放内存和文件句柄。这种方法适用于大文件处理,能够显著提升读取效率。原创 2025-05-10 11:55:18 · 64 阅读 · 0 评论 -
系统级编程(二):通过读取PE文件获取EXE或者DLL的依赖
Windows的PE文件(Portable Executable)是一种专为Windows操作系统设计的标准可执行文件格式,用于存储和管理可执行程序、动态链接库(DLL)、驱动程序等二进制文件。PE文件格式自Windows NT 3.1引入以来,已成为Windows平台上所有可执行文件的标准格式,并广泛应用于后续的Windows版本,包括Windows XP、Windows 7、Windows 10等。原创 2025-05-06 17:25:34 · 323 阅读 · 0 评论 -
系统级编程(一):内存的段页式管理
C++语言的强大之处就在于利用指针直接操作内存,从而得到超高的性能和非常灵活的编码方式。所以,更加进一步的了解操作系统对内存的使用和分配是非常有必要的,这一部分不完全是C++/C语言的范畴,更多的是操作系统原理,或者是计算机体系结构知识体系的范畴。原创 2025-05-06 17:24:31 · 171 阅读 · 0 评论 -
C++ DLL导出时变量与函数的区别:IAT导入地址表
DLL编程中的IAT导入地址表原创 2025-03-27 15:32:59 · 188 阅读 · 0 评论 -
嵌入式开发:程序下载(包括ARM和FPGA)
嵌入式开发的范围很广,ARM公司的STM芯片应该算是应用很广的开发内容。ARM一般通过Keil软件来进行开发。用Keil软件编译完成之后,就可以通过下载线下载到ARM芯片的固件中存储起来。原创 2025-01-22 10:44:54 · 261 阅读 · 0 评论 -
C++异步编程之协程
这个函数会返回一个包含promise_type的类,以及这个类的一个句柄std::coroutine_handle<promise_type> coro_handle;所谓的异步编程,主要的问题也是说如何解决好多个线程之间调用先后问题,通过锁机制可以有效的控制多个线程的执行顺序,比如上面文章中提到的生产者-消费者模式。在JS语言中,对于这个异步编程模型有着一个非常通用的编程模型:Promise。在之前的异步编程的文章中,提到过C++中一种非常普遍的异步编程方式:锁机制。通过co_return来结束协程。原创 2025-01-22 10:44:19 · 121 阅读 · 0 评论 -
C++中的左值,右值,拷贝,移动,转发等概念
写C++的人都知道,C++类定义中的构造函数是非常重要的,如果一个类中的成员有指针的话,是需要定义一些不同类型的构造函数来处理这些指针的,不然非常容易出现内存的越界访问和内存泄漏。而右边的值可以是变量,也可以是常量,也就是在执行过程中不发生变化的,在内存中也没有地址(其实是有地址的,一般在常量去,&这个取地址运算符不能做用于这个上面)。简单的理解,赋值运算符的左边的值可以是变量,是可以在执行过程中发生变化的,或者说这个值在内存中是有地址的,可以被取地址操作的。原创 2025-01-02 14:50:17 · 268 阅读 · 0 评论 -
C++代码中数组操作的安全性探讨:基础数组,vector和span
但是这里存在的一个问题就是vector会存在一个内存拷贝的问题,也就是vector和vector内的元素都会重新拷贝一份,如果是类的话,还会执行内存拷贝的构造函数。这样的数组在函数传递的时候,会存在一个数组退化的问题(array decay),也就是退化成了一个指针。在函数参数传递的时候,必须跟一个size的参数过去,否则无法对这个指针进行安全的使用。越界问题我们等下比较vector和span的时候再说,先提一下span的用法,我理解其实就是一个vector的引用!以我自己用的比较多的vector为例。原创 2025-01-02 14:48:56 · 135 阅读 · 0 评论 -
C++代码强制转换之reinterpret_cast
double这个会提示报错。doubledouble输出结果是4.94066e-324,这个可以参考double在各种体系结构中的分解了。从大模型中截取了一段给给位做个参考,这个就不细说了:在x86架构中,double双精度类型数据遵循IEEE 754标准进行存储和表示。根据IEEE 754标准,双精度浮点数由三个主要部分组成:1位符号位(S),11位指数位(E),以及52位尾数位(M)。这种结构使得双精度浮点数能够表示非常大的数值范围和高精度的小数部分。原创 2024-12-23 16:20:15 · 235 阅读 · 0 评论 -
C++代码强制转换之dynamic_cast
dynamic_cast 是 C++ 中用于在运行时进行类型转换的操作符,主要用于处理多态类型(即包含虚函数的类)。它允许将基类指针或引用安全地转换为派生类指针或引用。如果转换失败,dynamic_cast 会返回 nullptr(对于指针)或抛出 std::bad_cast 异常(对于引用)。原创 2024-12-23 16:19:30 · 155 阅读 · 0 评论 -
C++利用多态对工厂模式的一种实现
这种模式是可以实现根据不同的传入参数实现不同的类的创建,但是稍显不优雅。原创 2024-12-20 16:21:21 · 225 阅读 · 0 评论 -
C++代码强制转换之static_cast
static_cast用于基本数据类型转换、指针和引用的转换以及类层次结构中的上行和下行转换。static_cast 是编译器内置的功能,是在编译时进行的,没有运行时开销,也就是编译链接后就直接形成了汇编代码。其实现细节通常不在标准库的源码中,而是直接嵌入到编译器的代码生成部分。static_cast会做一些类型检查,比如指针的转换,基本类型的指针转换是无法通过static_cast来做转换的完全不相干类之间也无法通过static_cast来做转换。原创 2024-12-20 16:19:01 · 112 阅读 · 0 评论 -
C++类中const变量的使用过程中的一些注意事项
const变量是C++代码中一个比较常用的关键字,比起定义一个宏,const修饰的变量可以让编译器做一些类型检查等工作,能比较好的保证代码的稳定性和可靠性。但是这个const用起来,有时候也有点小坑。原创 2024-12-16 09:25:14 · 105 阅读 · 0 评论 -
C++的虚表:重载逻辑详解
C++的虚表结构与逻辑是实现面向对象编程的基石之一,虽然是一个比较老的话题,也必须拿出来再整理一遍。结构大概是这样的:下面所有的代码都是在Visual Studio下调试的,VS的图形界面调试还是比linux下要舒服的多。原创 2024-12-16 09:24:26 · 226 阅读 · 0 评论 -
【技术点】数据结构--二叉树之红黑树(三)
文章目录前言红黑树为什么要有红黑树前言前面两篇文章:【技术点】数据结构–二叉树(一)【技术点】数据结构–二叉树(二)讲了普通二叉树然后再到平衡搜索二叉树(BBST,Balance Binary Search Tree,又称AVL树)。这一篇来讲讲更厉害(也就是更复杂)的一种树:红黑树(RBTree, Red Black Tree)。红黑树为什么要有红黑树前面讲到的AVL树在搜索性能上已经达到了二分查找的性能:O(lgn)。在插入时的性能也是最多两次旋转就可以调整完成,所以插入性能是 O(原创 2020-07-05 09:13:05 · 28701 阅读 · 0 评论 -
【技术点】数据结构--二叉树(一)
文章目录前言基本二叉树二叉树定义二叉树遍历满二叉树 & 完全二叉树BST - 搜索二叉树搜索新增节点删除前言二叉树,数据结构的终结者,面试官的最爱。BST,红黑树,完全二叉树各种概念很容易就傻傻分不清楚。以前了解的东西都很散,写个文章将这些东西记录清楚。基本二叉树二叉树定义二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是一个递归的概念。二叉树遍历深度优先搜索广度优先搜索应该说,树这种数据结原创 2020-06-28 22:48:14 · 32877 阅读 · 0 评论 -
【技术点】数据结构(六) -- 哈希表
文章目录简介哈希函数直接寻址法取模法其他冲突的处理链地址法开放地址法其他实例JAVA中的哈希表Entry对象 & 哈希映射方法映射计算方法冲突解决办法 - HashMap存储结构扩容总结简介 前面几篇已经讲了树这种数据结构,分几篇文章列举了常见的几种数据结构:二叉树、红黑树、B树、B+树等。这些数据用于查询的平均新能都是 O(n)。有没有更快的呢?答案是有的,有一种数据结构在理论上的查询性能是O(1),也就是一个常量,这就是我们今天要讲的散列表(或者称哈希表)。 哈希表实际上由两个部分组成原创 2020-07-25 15:11:21 · 13291 阅读 · 0 评论 -
【技术点】数据结构--二叉树(二)
文章目录前言前言接上面一篇文章:【技术点】数据结构–二叉树(一)这次讲点更厉害的树:平衡二叉树(AVL)和红黑树原创 2020-06-30 17:23:56 · 32104 阅读 · 0 评论 -
【技术点】数据结构(七) -- 图(数据结构系列终结篇)
文章目录引言图的若干概念图的定义图的几种典型类型无向图有向图加权图完全图顶点 & 边互相之间的各种关系邻接出度 & 入度路径 & 环等一堆和路径相关的概念图的存储邻接矩阵邻接链表十字链表图的遍历广度优先 - BFS深度优先 - DFS关于图的一些算法Dijkstra算法(节点之间的最短算法)算法过程描述实现代码最小生成树算法:prime算法算法过程描述实现代码总结引言 作为一个到35岁需要转行成为快递小哥的程序员,必须先了解一下快递小哥这一行业。当一个快递小哥拿到很多个快递的时原创 2020-07-31 16:36:51 · 9036 阅读 · 0 评论 -
【技术点】计算机基础算法——排序 & 搜索 & 字符串匹配
文章目录前言排序搜索搜索模式匹配朴素模式匹配KMP算法核心逻辑预处理过程KMP代码:前言 之前写过一个数据结构的专栏: 在专栏里介绍了一些常用的数据结构及其操作。现在想着把一些常用的算法也罗列出来讲一讲,总结一下。这里的算法和现在的AI算法是两码事,我个人的简单理解是计算机科学中的一些经典算法,如排序,搜索等。在整个计算机的处理过程中,大量的操作都可以抽象为排序和搜索。所以了解这两中基本算法类是非常有必要的。排序 我们收集到的数据往往都是无序和杂乱的,在做数据清理和数据整理的时候,最常用的操原创 2020-12-04 12:48:21 · 372 阅读 · 0 评论 -
【技术点】数据结构--B树系列(四)
文章目录前言B树/B-树树结构中的度前言前几篇文章讲常用的二叉树结构都讲完了。传送门:【技术点】数据结构–二叉树(一)【技术点】数据结构–二叉树(二)【技术点】数据结构–二叉树之红黑树(三)在树这种大的数据结构中,除了二叉树,还有几种树是在实际中应用的较多的,比如这篇文章想将的B树系列(B树/B-树/B+树/B*树)B树/B-树首先,这两个树就是同一个东西,只是在翻译的过程中,将“B-Tree”这个专业词汇中间的那根杠杠怎么理解的问题,忽略那根杠杠,就是B树;不忽略就是B-树。树结构中的原创 2020-07-11 23:11:20 · 23193 阅读 · 0 评论 -
【技术点】数据结构--B树系列之B+树(五)
文章目录前言B+树的结构Key & Data叶子节点保存数据:减少I/O的设计中间节点的索引作用链表的作用:范围查询前言前面几篇写完了B树:【技术点】数据结构–B树系列(四)这一篇来讲讲B+树,B+树一般是用于索引:数据库索引、文件系统索引等等。那我们来看看两个问题:B+树和B树的区别?有了B树为什么还要B+树?从第一个问题引申出来,为什么B+树很适合用于索引?B+树的结构借用百度百科上的定义:B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结原创 2020-07-20 17:56:43 · 19104 阅读 · 0 评论 -
C++编程中的段错误:segmentation fault和bus error常见原因和捕获方法
任何一个C++ coder应该都碰到过这个问题,程序跑着跑着直接出现这个错误,整个程序崩掉。这个错误的本质原因在于代码中有代码访问了不属于代码进程的内存范围,就会触发这个segmentation fault。或者换句话说就是,内存访问越界,访问了不属于自己的内存。在说具体哪些之前,先简单插一句,为什么内存访问会越界,又为什么会提示segmentation fault这个错误信息。原创 2024-12-12 09:41:45 · 389 阅读 · 0 评论 -
使用std算法库:排序sort来排基本类型与类对象
在C++的std库中,提供了不少基础的算法工具库,比如最基本的查找,排序等,基本上都是封装了性能极高的查找和排序算法,基本上不需要自己再去琢磨和手写各种计算机算法了,比如快排什么的,直接使用即可。不过这些算法库基本用法挺简单,在基础用法的基础上,还是有一些厉害一点的用法。原创 2024-12-12 09:40:19 · 176 阅读 · 0 评论 -
使用std算法库:使用find算法来处理基础类型与类对象
在C++的std库中,提供了不少基础的算法工具库,比如最基本的查找,排序等,基本上都是封装了性能极高的查找和排序算法,基本上不需要自己再去琢磨和手写各种计算机算法了,比如快排什么的,直接使用即可。不过这些算法库基本用法挺简单,在基础用法的基础上,还是有一些厉害一点的用法。原创 2024-12-09 10:27:45 · 251 阅读 · 0 评论 -
用C++代码利用std::filesystem库写入一个文件路径到数据库中
使用C++代码写数据库不是什么麻烦事,但是和成熟的JAVA体系不一样,C++没有那么多成熟的数据库操作,比如mybatis等等。而且C++一般来说也不会用于写业务软件,不会用比较重的三方库。所以有时用C++代码来直接操作数据库,碰到的一个问题是:需求是将一个形如:c:\test\test.log这样的文件名写入到该字段。本来这个需求非常简单,麻烦就麻烦在路径间隔符同时在C++和SQL语言中都是一个转义字符。原创 2024-12-09 10:23:04 · 119 阅读 · 0 评论 -
C++代码中为什么要有extern C——防止集成C代码库链接失败
在C++代码中,很多引用头文件中都会有extern "C"的代码。这个表示这一段代码是使用C的标准写的,要求C++编译器按照C语言的标准来编译和链接。那么,这个关键字到底干了啥,这就是这一篇文章需要说清楚的问题。原创 2024-12-05 11:45:38 · 122 阅读 · 0 评论 -
操作系统内存模型初探——一次C++内存泄漏深究
已提交内存,其实就是内存分页管理中的一个概念,或者说是windows弄出来的一个概念,实际上就是物理内存 + pagefile。原创 2024-12-05 11:44:44 · 257 阅读 · 0 评论 -
C++中的操作系统级信号处理——signal与sigaction
在多进程的编程中,信号是一种非常重要的多进程通讯手段。而进程间的信号很大情况是和操作系统是相关的,或者说很多信号是从操作系统中过来的。我们这一篇就来说一下操作系统的信号。操作系统中的信号其实在操作系统中可以称作是中断,可以理解为一个循环执行的程序中突然收到一个通知,或者信号,操作系统分配一个中断处理程序来处理这个中断信号。基本上所有的操作系统都是基于这个逻辑。而中断又可以简单的分成两个大类,硬件中断和软中断。原创 2024-12-03 09:21:33 · 354 阅读 · 0 评论 -
C++多线程编程场景(原子操作 + 生产者消费者模式)
也就是说一个线程通过修改共享内存中的一个变量,另一个线程就可以通过某种规则得到这个变动,作出相对应的动作。所以,多线程的通讯方式就可以看成是使用共享内存的方式。而控制共享内容的有序利用,主要的技术手段就是锁。在锁机制的基础上,用于多线程的通讯方式还有一些具体的使用方式。原创 2024-12-03 09:19:53 · 102 阅读 · 0 评论 -
嵌入式开发之STM32单片机结构
这一篇就先来了说说F407的引脚,我觉得STM32的开发基本上是围绕着STM32这款微控制器来进行的,所以了解微控制器有哪些引脚是一个比较好的开始。原创 2024-11-30 20:50:56 · 284 阅读 · 0 评论 -
C++类中多线程的编码方式
在C++代码中,一般的代码是需要封装在类里面,比如对象,方法等。否则就不能很好的利用C++面向对象的能力了。但是这个方式在处理线程时会碰到一个问题。一个类中有一个线程对象,并编写一个对应线程函数,在初始化时启动这个线程。而且这个线程中是需要访问到类中的其他成员变量的。这是面向对象语言的一个搭建类的基本方法。但是上面的代码是无法编译通过的:也就是说作为线程函数是需要为一个static方法的。原创 2024-11-30 20:48:46 · 416 阅读 · 0 评论 -
使用CEF框架实现文件下载
cef框架实现下载逻辑原创 2024-11-27 10:55:29 · 215 阅读 · 0 评论 -
std库锁机制的使用
在多线程编程中,关键资源的读写访问是程序员需要非常重视的部分。而控制好读写主要靠的就是锁机制,在各个编程框架中都提供了锁的实现机制。这一篇就简单列举一下std标准库中提供的一些锁机制。原创 2024-11-27 10:53:13 · 616 阅读 · 0 评论 -
C++泛型编程标准:C++17的std::variant
C++从11标准开始,越来越多的是增加C++这门语言的泛型编程能力,包括增加一些关键字,auto,decltype等,还是增加一些标准库的能力,我个人觉得都是提高泛型编程能力。还有就是提高语言使用的易用性和安全性,越来越像一门专门的面向对象语言,离传统中标准的C或者C++越来越远。这一篇要提到的std::variant库有点像原来的union联合类型。但是std::variant支持的类型和安全性都比union联合类型要强大。代码编译的时候记得增加 -std=c++17的编译选项。原创 2024-09-30 11:53:56 · 296 阅读 · 0 评论