C++开发基础
文章平均质量分 88
dotnet研习社
深耕桌面开发和软件设计领域,始终相信美好的事情即将发生,关注【dotnet研习社】一起学习成长~
展开
-
C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信
RabbitMQ是一个流行的开源消息队列系统,支持多种消息协议,广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中,我们将熟悉如何使用C++与RabbitMQ进行消息通信。我们已完成了在 Windows 平台上通过vcpkg安装并用 C++ 实现 RabbitMQ 消息发送和接收的完整教程。原创 2024-11-07 07:00:00 · 646 阅读 · 0 评论 -
C++开发基础之理解 CUDA 编译配置:`compute_XX` 和 `sm_XX` 的作用
在 CUDA 编程中,确保代码能够在不同的 NVIDIA GPU 上高效运行是非常重要的。为了实现这一点,CUDA 编译器 (nvcc) 提供了多种配置选项,其中compute_XX和sm_XX是两个关键的编译选项。本文将深入探讨这两个选项的作用及其配置顺序,帮助更好地理解和使用这些设置。compute_XX。原创 2024-09-13 11:23:19 · 1122 阅读 · 0 评论 -
C++开发基础之自定义异步日志库实现及性能测试
在软件开发中,日志记录是一个必不可少的部分。通过日志,我们可以记录系统的运行状态、错误信息以及调试数据。然而,当系统的日志量很大时,日志写入操作可能会影响系统的性能,尤其是在 I/O 操作较为频繁的情况下。因此,构建一个异步日志系统成为提升性能的重要手段。在这篇博客中,我们将实现一个 C++ 异步日志库,支持日志级别分类和自定义文件路径、文件名等功能。同时,我们还会进行性能测试,评估异步日志系统的写入效率。原创 2024-09-07 07:00:00 · 892 阅读 · 0 评论 -
C++开发基础之宏定义:入门、中级、高级用法示例解析
在C++开发中,宏定义是一种非常重要的预处理功能,能够简化代码、提高可读性、减少重复性工作。然而,宏的使用也存在一些潜在的风险,滥用宏可能导致代码难以调试和维护。在这篇博客中,我们将从入门、中级到高级,逐步深入解析C++中宏定义的用法,每个部分将包含5个示例,以帮助你更好地理解和掌握宏的使用。使用宏定义常量可以避免魔法数字(magic numbers)在代码中泛滥,提高代码的可读性。可以使用宏支持可变参数,实现类似printf的功能。原创 2024-09-02 10:35:21 · 2394 阅读 · 0 评论 -
C++ 开发基础之‘WIN32_LEAN_AND_MEAN’宏定义的作用
WIN32_LEAN_AND_MEAN是一个预处理器宏定义,通常在Windows编程中使用,特别是在包含Windows头文件(如windows.h)时。当在项目中定义了宏,它告诉编译器仅包含Windows SDK中最常用的函数和数据类型,从而减小编译时间和生成的可执行文件大小。总体而言,是一个优化工具,旨在帮助开发者创建更高效、更紧凑的Windows应用程序,但使用时需要权衡项目的需求和可能的限制。原创 2024-08-15 17:55:20 · 567 阅读 · 0 评论 -
C++ 开发基础之 `ofstream` 和 `ifstream` 文件操作核心用法
ofstream和ifstream是 C++ 中用于文件操作的两个基本类。ofstream用于将数据写入文件,而ifstream用于从文件中读取数据。通过掌握这些类的基本用法和高级技巧,可以更高效地处理文件操作,确保程序的稳定性和可靠性。原创 2024-08-08 15:37:53 · 545 阅读 · 0 评论 -
C++开发基础之深入理解C++中的两种单例模式实现——线程安全与效率的权衡
两种实现方式各有优劣。C++11风格的实现更加现代、简洁且易于维护,它利用了语言特性来自动处理线程同步问题,避免了显式管理锁的麻烦。然而,在C++11之前的项目中,或者在某些对性能有极致要求的场景下,传统的互斥锁实现可能更为合适,因为它提供了更细粒度的控制和可能的性能优化空间。原创 2024-08-06 23:17:14 · 479 阅读 · 0 评论 -
C++开发基础之初探CUDA计算环境搭建
项目中有使用到CUDA计算的相关内容。但是在早期CUDA计算环境搭建的过程中,并不是非常顺利,编写此篇文章记录下。对于刚刚开始研究的你可能会有一定的帮助。在这个项目中,我们主要体会框架的用法,以及CUDA计算环境搭建的。通过编码实践,构建项目成功实验了CUDA计算环境搭建,为接下来的工作准备好环境。原创 2024-06-06 23:54:12 · 1905 阅读 · 0 评论 -
C++开发基础之字符编码方案与多字节字符(char*)和宽字符(LPWSTR)之间进行转换
在Windows API编程中,有两种常见的字符编码方案Unicode 和 ANSI ,在日常开发过程中会在处理字符串参数时,多字节字符(char*)和宽字符(LPWSTR)之间需要进行转换。通过和函数可以方便地在多字节字符 和 宽字符 之间进行转换。同时,利用 C++ 标准库中的和也能实现这些转换。这些方法适用于不同的应用场景,不同的同类类型处理,选择适合自己的方法即可。不要忘记在使用动态分配内存时及时释放,以避免内存泄漏。原创 2024-05-30 11:00:12 · 1335 阅读 · 0 评论 -
C++开发基础之了解void*类型的指针用法
void*类型是一个通用的指针类型,可以指向任意类型的数据,但它本身不包含任何类型信息。在 C 和 C++ 等编程语言中,void* 类型的指针被用来表示一个未知类型的指针。这种指针的具体用法通常是为了实现一些通用的数据结构或算法,或者在不同类型之间传递指针时的类型安全性问题。在C++中,任何对象的指针都可以转换为void*类型的指针,这种转换称为指针的强制类型转换或隐式转换。这种特性允许将任何类型的指针赋值给void*类型的指针,并且可以通过或者 C 风格的强制转换来实现。原创 2024-05-09 14:24:05 · 1004 阅读 · 0 评论 -
C++开发基础之函数参数传递的几种类型
在C++中,接口指针或类对象的函数参数传递是一个常见的做法,特别是在需要支持多态或动态绑定时。这里将介绍如何传递接口指针或类对象作为函数参数。原创 2024-05-07 17:59:09 · 528 阅读 · 0 评论 -
C++开发基础之浅谈多线程的锁机制
在C++中,多线程的锁机制是确保线程安全的重要组成部分。当多个线程需要访问共享资源时,锁可以防止同时访问,从而避免数据竞争和条件竞争。C++11及其之后的版本提供了多种锁机制,包括互斥锁(mutex)递归锁(recursive mutex)共享锁(shared mutex)和读写锁(read-write mutex)。互斥锁(std::mutex)std::mutex是最基本的锁类型,用于保护共享数据,确保同时只有一个线程可以访问该数据。使用lock和unlock方法或者和管理类来简化锁的管理。原创 2024-05-07 11:11:20 · 2126 阅读 · 0 评论 -
C++开发基础理解std::string 对象的生命周期,避免悬空指针或内存访问错误
避免悬空指针或内存访问错误。在处理字符串转换时,始终牢记确保数据的有效性和一致性是非常重要的。原创 2024-03-28 13:21:46 · 910 阅读 · 0 评论 -
C++开发基础之对象的生存周期和内存管理方式(堆内存和栈内存)
栈内存适合用于管理局部变量和短期对象,自动分配和释放,速度快,但大小受限;堆内存适合用于动态分配内存,对象生存期需要延长或者大小不确定的情况,需要手动管理内存,速度较慢,容易出现内存泄漏问题。原创 2024-03-20 10:31:23 · 883 阅读 · 0 评论 -
C++开发基础之宏定义
宏定义的工作原理涉及到宏的解析和展开过程,以及如何使用带参数的宏。通过对这些过程的理解,我们可以更清楚地掌握宏定义在代码中的作用。当我们讨论如何定义简单的宏和带参数的宏时,我们需要考虑如何使用#define关键字来创建这些宏。使用#define关键字可以定义简单的宏,通常用于定义常量或简单的替换文本。(a) : (b))其中,第一个宏定义了常量PI,第二个宏定义了一个比较大小的函数式宏。带参数的宏可以通过在宏定义中使用参数来实现更灵活的功能。这里,SQUARE宏接受一个参数并返回该参数的平方,而。原创 2024-03-19 10:20:04 · 1477 阅读 · 0 评论 -
C++开发基础之探索程序启动入口函数
在C++编程中,了解程序的入口函数是至关重要的。入口函数是程序执行的起点,它接收参数并开始执行程序的主要逻辑。对于应用程序而言,有多种入口函数可供选择,每种都有其特定的用途和适用场景。本文将深入探讨C++程序开发中常见的入口函数。main主要用于命令行应用程序。是 C/C++ 程序的入口函数。接收argc和argv参数,用于处理命令行参数。WinMain主要用于 Windows 图形用户界面 (GUI) 应用程序。是 Windows 程序的入口函数。通过调用等函数来创建和管理窗口。原创 2024-03-08 10:19:28 · 2023 阅读 · 0 评论 -
C++开发基础之简单的计时器也有适配场景
计时器的开发通常涉及到计算时间间隔的方法和计算时间的方式。获取起始时间点:在开始计时时,记录当前的时间戳作为起始时间点。获取结束时间点:在结束计时时,记录当前的时间戳作为结束时间点。计算时间间隔:通过起始时间点和结束时间点的差值,计算出经过的时间间隔。显示计时结果:将计算得到的时间间隔转换成合适的时间单位(如毫秒、秒等),并展示给用户。每种方法都有其独特的优势和劣势,具体选择取决于项目需求、平台要求和精度要求。原创 2024-03-06 17:57:26 · 1268 阅读 · 0 评论 -
C++开发基础之异步编程模式
异步编程模式是现代C++开发中不可或缺的一部分。在处理IO密集型或者长时间运行的任务时,异步编程可以提高程序的响应性和吞吐量。1. 需要执行耗时的 I/O 操作:例如读取文件、数据库操作、网络请求等,这些操作通常需要花费较长时间。如果使用同步方法,程序将会被阻塞,无法响应其他操作。而使用异步编程模式,可以在这些操作执行过程中继续处理其他任务,从而提高程序的并发性能和响应能力。2. 需要执行计算密集型操作:虽然异步编程通常与 I/O 操作相关联,但它也可以用于执行计算密集型操作,例如图像处理、科学计算等。原创 2024-02-28 10:58:24 · 1737 阅读 · 0 评论 -
C++开发基础之文件操作
C++ 是一种功能强大的编程语言,它提供了丰富的文件操作功能,可以用于读取、写入和处理文件。在本文中,我们将介绍 C++ 中文件操作的基础知识,包括读写文件和一些常见的文件操作。原创 2024-02-27 17:51:06 · 5622 阅读 · 0 评论 -
C++开发基础之命名空间
命名空间是C++中用来组织和管理标识符(如变量、函数、类等)的一种机制。它可以帮助解决不同作用域中标识符的冲突问题,并提供了一种组织和封装代码的方式。C++中的命名空间是一种用来避免命名冲突并组织代码的机制。在C++开发中,命名空间起着非常重要的作用,可以帮助我们编写清晰、模块化的代码,并提高代码的可维护性和可读性。在C++中,可以使用namespace// 函数实现// 类定义和实现。原创 2024-02-23 18:03:15 · 474 阅读 · 0 评论 -
C++开发基础之理解结构体和类型别名妙用
当定义结构体和类型别名时,可以使用using关键字代替typedef,这样可以使代码更加简洁易懂.原创 2024-02-22 14:13:04 · 1472 阅读 · 0 评论 -
C++开发基础之函数的参数类型高级用法
当涉及到高级参数传递方式时,有几种常见的技术可以在 C++ 中使用。原创 2024-02-21 09:00:00 · 1052 阅读 · 0 评论 -
C++开发基础之函数的参数类型基础用法
在C++中,函数的参数类型可以是以下类型之一:值参数(Value parameters):将参数作为函数的副本传递。这意味着在函数内部对参数值的更改不会影响原始变量。在函数调用时,可以将常量、变量或表达式作为实参传递。引用参数(Reference parameters):将参数作为原始变量的引用传递。这允许函数更改原始变量的值,并且避免不必要的复制。在函数调用时,必须使用变量或表达式的名称作为实参传递。指针参数(Pointer parameters):将参数作为指向原始变量的指针传递。原创 2024-02-20 10:37:03 · 1122 阅读 · 0 评论 -
C++开发基础之智能指针(smart pointers)
C++ 智能指针(smart pointers)是一种可以自动管理内存的指针。在 C++ 中,手动管理内存很容易出错,特别是在涉及到动态分配内存和释放内存的时候。使用智能指针可以避免很多内存操作上的错误,提高代码的可读性和安全性。智能指针有三种常用的类型:shared_ptr 、 unique_ptr和weak_ptr。下面将介绍它们的用法。原创 2024-02-19 11:19:08 · 1114 阅读 · 1 评论 -
c++开发基础之保障多线程编程中的原子操作InterlockedIncrement和InterlockedDecrement用法详解
在多线程编程中,确保对共享变量进行原子操作是至关重要的。当多个线程同时访问和修改同一共享资源时,如果没有合适的同步机制,可能会导致数据竞争、内存一致性问题,甚至造成程序崩溃。为了解决这个问题,C++提供了一组原子操作函数,其中包括InterlockedIncrement和InterlockedDecrement。本文将深入探讨这两个函数的用法,以及它们在多线程环境中的重要性。原创 2024-02-18 11:03:21 · 1301 阅读 · 1 评论 -
C++开发基础之循环链表详解含示例
循环链表的结构可以通过定义一个节点结构体来实现。每个节点包含两个主要成员:数据和指向下一个节点的指针。int data;// 节点中存储的数据Node* next;// 指向下一个节点的指针在循环链表中,需要注意的一点是最后一个节点的指针不是NULL,而是指向头节点,形成了一个环。因此,在创建循环链表时,需要特别处理最后一个节点的指针,使其指向头节点。另外,为了方便操作循环链表,还可以定义一个指向头节点的指针,以便快速访问和操作循环链表的各个节点。// 指向循环链表头节点的指针。原创 2024-02-02 14:47:07 · 1725 阅读 · 0 评论 -
C++开发基础之预编译头文件 stdafx.h的作用
stdafx.h 是一个预编译头文件,在 Visual C++ 中被广泛使用。它包含了一组常用的头文件,这些头文件在整个项目中会被频繁使用。通过预编译头文件,编译器可以事先处理这些头文件,并将其保存在一个二进制文件中,以加快后续的编译过程。原创 2024-02-01 10:41:53 · 2396 阅读 · 1 评论 -
C++开发基础之生产者和消费者模型:实现多线程数据交换与同步
在并发编程中,处理多个线程之间的数据交换和同步是一个常见而重要的挑战。生产者和消费者模型是一种经典的解决方案,它为我们提供了一种简单而灵活的方法来协调多个线程的操作。无论是构建消息队列、日志记录系统还是任务调度系统,生产者和消费者模型都能够有效地管理数据流,提高系统的性能和可靠性。生产者和消费者模型是一种常见的多线程编程模型,用于解决生产者和消费者之间数据交换和同步的问题。它可以应用于各种场景,如消息队列、日志记录系统、任务调度系统等。通过合理地设计和实现生产者和消费者模型,可以提高系统的并发性能和可靠性。原创 2024-01-30 23:43:45 · 1038 阅读 · 1 评论 -
C++开发基础之提升效率的神奇工具掩码的妙用
在C++编程中,我们经常面对需要在位级别上进行操作的情况。**掩码(Mask)**是一种强大的工具,不仅可以提高代码的效率,还能使代码更为紧凑和可读。在本篇博客中,我们将深入探讨掩码的应用,并演示如何巧妙地运用它来解决各种编程问题。掩码是一个包含了特定位信息的二进制数。通过将掩码与目标值进行按位与运算,我们可以保留或清除目标值的特定位。// 定义目标值和掩码// 二进制表示法// 应用掩码// 输出结果。原创 2024-01-29 10:32:59 · 1533 阅读 · 0 评论 -
C++开发基础之掌握常用的三种异步编程模型
以上是三种常见的C++异步编程模型,每种模型都有其适用的场景和特点。根据具体需求,你可以选择合适的模型来进行异步编程。原创 2024-01-26 11:52:15 · 1345 阅读 · 1 评论 -
C++开发基础之PugiXML库基础用法详解
PugiXML是一个开源、轻量级的C++ XML解析库,它具有简单易用、高效稳定的特点。本文将介绍如何使用PugiXML库来解析和创建XML文档。原创 2024-01-25 09:10:55 · 2828 阅读 · 0 评论 -
C++开发基础之基于SQLite数据库开发的基础知识
SQLite是一个自包含、无服务器的SQL数据库引擎。轻量级:SQLite库非常小巧,适合嵌入到应用程序中。零配置:SQLite不需要独立的服务器进程或配置文件。单文件存储:整个数据库存储在单个文件中,方便管理和迁移。ACID事务支持:支持原子性、一致性、隔离性和持久性的事务操作。本篇博客提供了C++与SQLite数据库交互的基础知识和操作示例。希望能够帮助您在C++开发中有效地使用SQLite数据库。原创 2024-01-24 13:52:38 · 2572 阅读 · 1 评论 -
C++基础开发之DLL开发的导出函数与C#导入函数参数类型对齐
在C++中,通过DLL导出函数,通常使用__declspec(dllexport)修饰符。在C#中,通过DllImport来导入C++ DLL中的函数。确保参数类型在C++和C#之间正确对齐非常重要,在 C++ 开发 DLL 提供给 C# 使用的过程中,导出函数的参数类型可以包括多种。以下是一些常见的参数类型,以及每种类型的示例,同时提供了相应的 C#DllImport函数的编写方式。原创 2024-01-20 06:00:00 · 611 阅读 · 0 评论 -
C++开发基础之命名管道用法详解含示例程序
命名管道(Named Pipe)是一种在操作系统中用于进程间通信的机制。它允许不相关的进程通过共享一个命名的管道来交换数据。命名管道可以在本地计算机上的进程之间进行通信,也可以在不同计算机上的进程之间进行跨网络通信。命名管道的创建和使用类似于传统的匿名管道(Anonymous Pipe),但有一些重要的区别。首先,命名管道是具有唯一名称的,而匿名管道是无名的临时管道。其次,命名管道可以在不同的进程之间进行通信,而匿名管道仅限于父子进程或相关进程之间的通信。原创 2024-01-22 19:26:48 · 2084 阅读 · 0 评论 -
C++开发基础之创建DLL的常见的6种导出函数(Export Functions)形式
Windows将函数声明和定义分开,使用 __declspec(dllexport) 修饰定义原创 2024-01-19 17:58:10 · 4365 阅读 · 0 评论 -
C++开发基础之数据结构基础双链表模型
双向链表(Doubly Linked List)是一种链表数据结构,与单向链表不同,它的每个节点包含两个指针,分别指向前一个节点(前驱)和后一个节点(后继)。由于每个节点都有前一个节点的指针,因此在双向链表中,可以从头节点开始,沿着后继指针一直遍历到尾节点,也可以从尾节点开始,沿着前驱指针一直遍历到头节点。这种特性使得双向链表的遍历更加灵活。相比单向链表,双向链表在插入和删除节点时更为高效。原创 2024-01-19 10:54:26 · 999 阅读 · 0 评论 -
C++开发基础之网络编程WinSock库使用详解TCP/UDP Socket开发
Winsock提供了一组函数和数据结构,这些函数和数据结构可以让开发人员创建和管理套接字(Socket),并通过套接字与其他计算机进行通信。Winsock提供了一些基本的套接字函数,如socket()、bind()、connect()、send()、recv()等,这些函数实现了套接字的创建、绑定、连接、发送数据和接收数据等操作。一旦有客户端连接,就会创建一个新的套接字来处理客户端请求,然后通过该套接字与客户端进行通信。函数接受客户端的连接请求,并返回一个新的socket文件描述符,用于后续与客户端通信。原创 2024-01-15 11:51:23 · 2208 阅读 · 0 评论 -
C++开发基础之CreateThread详细用法
在上面的示例中,我们首先创建了一个信号量 semaphore,然后使用 CreateThread 创建了一个新的线程,并将线程函数设置为 MyThreadFunction。该函数返回之前的线程亲和性掩码,可以用来还原之前的设置。GetThreadAffinityMask和SetThreadAffinityMask是Windows API提供的两个函数,用于获取和设置线程的亲和性掩码。在调用CreateThread函数后,新线程将开始运行指定的线程函数,并且可以访问该函数中的参数。原创 2024-01-11 10:20:02 · 5766 阅读 · 1 评论 -
C++开发基础之Windows平台共享内存开发入门
共享内存是一种在多个进程之间共享数据的有效方式,而内存映射文件技术(Memory-Mapped Files)提供了一种将磁盘文件映射到进程地址空间的机制,在Windows提供了一组API,使得在C++中实现共享内存变得相对容易。原创 2024-01-18 17:28:59 · 1922 阅读 · 0 评论