自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小庞的博客

欢迎光临小庞的博客,多多指教

  • 博客(42)
  • 收藏
  • 关注

原创 Visual Studio 编译错误 LNK2038:MTD 和 MDD 的区别及解决方法

LNK2038错误通常是由于运行时库配置不匹配引起的。通过检查项目设置,统一运行时库配置,修改第三方库的配置,使用预处理器指令等方法,可以有效解决这个问题。希望本文能够帮助你更好地理解和解决LNK2038错误,提高项目的编译和运行效率。

2025-03-04 14:48:22 1000

原创 or-tools编译命令自用备注

DCMAKE_CXX_FLAGS="/utf-8" //强制使用 UTF-8 编码。-DCMAKE_INSTALL_PREFIX=install //带安装命令。# 设置 HTTP/HTTPS 代理(替换为你的代理地址和端口)-DBUILD_DEPS=ON //联网下载。//查看git clone是否能用。

2025-02-27 20:19:20 302

原创 ​手把手教程:在 VS2017 32位 Windows 环境下编译 OR-Tools 9.6 并集成到 C++ 项目

通过本文的两种方法,你可以根据需求选择快速集成或深度定制 OR-Tools。

2025-02-27 14:43:10 1097

原创 线程池中的设计细节:并发执行与锁的优化

线程池是一种管理线程资源的机制,它预先创建一组线程,这些线程可以被重复使用来执行多个任务。减少线程创建和销毁的开销:线程的创建和销毁需要消耗系统资源,线程池可以避免频繁的线程创建和销毁。控制并发线程的数量:线程池可以限制同时运行的线程数量,避免过多的线程竞争资源导致性能下降。提高系统的响应速度:线程池中的线程可以快速响应任务请求,提高系统的整体性能。线程池是并发编程中的一种重要工具,通过合理的设计和优化,可以充分利用 CPU 资源,提高系统的性能和稳定性。

2025-02-25 11:33:27 398

原创 服务器缓存区的过期删除策略:原理与实现

缓存区是服务器架构中不可或缺的一部分,但管理不当可能会导致性能问题。通过设置合理的过期删除规则,可以确保缓存区中的数据始终是最新的,同时避免内存占用过多。本文介绍了几种常见的缓存过期删除策略(TTL、LRU、LFU),并提供了相应的实现方法和示例代码。希望读者能够通过本文掌握缓存区管理的关键思路,并在实际应用中加以运用。

2025-02-25 11:28:15 1002

原创 C++项目集成OR-Tools库使用方法

如果你希望将OR-Tools的库和头文件整合到你的源项目中以便在本地运行和调试,可以按照以下步骤进行操作:(假设你已经下载了OR-Tools的二进制文件并解压到某个目录,例如。

2025-02-14 09:45:50 793

原创 Google的OR-Tools:运筹学与优化的强大工具

OR-Tools(Operations Research Tools)是Google开源的一个用于组合优化的软件套件,旨在帮助开发者解决各种复杂的调度、路由、分配和资源管理问题。它集合了多种算法,包括线性规划、整数规划、网络流模型、图算法等,为处理组合优化问题提供了一站式的解决方案。OR-Tools支持多种编程语言,如C++、Python、Java和.NET,让开发人员可以根据项目需求选择最适合的语言。

2025-02-14 09:43:51 1100

原创 轻松上手 C++ 的 RapidJSON 解析库:从零开始的教程

RapidJSON 是一个高性能、轻量级的 JSON 解析库,专为 C++ 设计。高性能:RapidJSON 的解析速度非常快,几乎可以与strlen()函数的速度相媲美。易用性:RapidJSON 提供了简洁的 API,使得解析和生成 JSON 数据变得非常简单。灵活性:支持多种数据类型,包括对象、数组、字符串、数字、布尔值和 NULL。跨平台:支持 Windows、Linux、macOS 等多种操作系统。在访问 JSON 数据之前,最好先检查成员是否存在,以避免程序崩溃。可以使用HasMember。

2025-02-08 17:58:10 853

原创 C++ 中的 cJSON 解析库:用法、实现及递归解析算法与内存高效管理

cJSON 是一个轻量级的 JSON 解析库,支持 C 和 C++ 语言。它提供了简单易用的 API,可以方便地解析 JSON 数据和生成 JSON 字符串。轻量级:cJSON 的代码量较小,适合嵌入式系统和资源受限的环境。高性能:cJSON 使用高效的解析算法,能够快速解析和生成 JSON 数据。易用性:cJSON 提供了简洁的 API,开发者可以轻松上手。灵活性:cJSON 支持多种数据类型,包括对象、数组、字符串、数字、布尔值和 NULL。

2025-02-08 17:50:19 822

原创 人工智能:程序员的未来之路

人工智能为程序员带来了前所未有的机遇。从基础数学到深度学习,从理论学习到实战项目,这条学习之路虽然充满挑战,但也充满了乐趣。程序员们需要不断学习、实践和创新,才能在这个快速发展的领域中脱颖而出。记住,AI 的未来就在你的手中,只要你愿意迈出第一步。无论你是刚刚踏上 AI 之旅的新手,还是希望在这一领域深耕的资深程序员,持续学习和实践都是成功的关键。让我们一起拥抱人工智能,开启属于程序员的未来篇章!

2025-01-21 11:36:30 644

原创 【C++开源库】tinyxml2解析库使用介绍

TinyXML-2是一个功能强大且易于使用的XML解析库,它为C++开发者提供了快速解析和生成XML数据的能力。通过简单的API和跨平台的支持,TinyXML-2成为了处理XML数据的理想选择。无论是在大型企业应用还是在资源受限的嵌入式系统中,TinyXML-2都能发挥其优势。

2025-01-11 17:19:43 744

原创 【C++开源库】Boost.Asio网络库使用介绍

Boost.Asio是一个功能全面的库,它提供了异步编程模型、跨平台兼容性、高性能和灵活性等特性。它被广泛应用于构建各种类型的网络应用程序,包括Web服务器、游戏服务器、实时通信系统等。通过简单的配置和代码,你可以轻松实现高效的网络通信功能,提升项目的可维护性和调试效率。

2025-01-11 17:12:37 684

原创 C++高性能日志库spdlog实战

spdlog是一个由Gabriel Melman开发的高速、轻量级的C++日志库,旨在提供简单易用的日志记录功能,同时保持高性能。它支持多种日志目标,包括控制台、文件、轮转文件等,允许自定义日志过滤和动态改变日志级别。该库的设计使其在多线程环境中也能安全使用,适合高负载的日志记录场景。spdlog是一个功能强大且易于使用的C++日志库,适合各种项目开发需求。通过简单的配置和代码,你可以轻松实现高效的日志记录功能,提升项目的可维护性和调试效率。t=O83A。

2025-01-10 15:12:10 1033

原创 个人总结-遇到的问题以及如何解决

.Linux下检测内存泄漏的工具:Valgrind。在线程无限次测试,是否还有内存泄漏的情况下,在调用堆栈的调试下,终于找到了。我的线程中有epoll_wait,在没有事件发生的时候,它是一直阻塞住的,也就是析构函数将while(条件)中的条件=false;它还是阻塞住的,也就是不会跳出线程中,导致线程资源也是不能及时释放的。解决办法:在析构函数中,使用event_fd,在唤醒阻塞住的epoll_wait。epoll事件驱动模式

2024-12-28 15:26:40 659

原创 探索 C++ 中的 Any 类:灵活处理任意类型数据

在 C++ 编程中,我们经常需要处理各种不同类型的数据。标准库提供了std::any类来存储任何类型的值,但了解其底层实现可以帮助我们更好地掌握 C++ 的特性。本文将介绍一个自定义的Any类,它模仿std::any的功能,允许存储和操作任意类型的数据。

2024-12-21 14:30:06 322

原创 进程、线程和协程:一文理解并搞懂

在计算机科学中,进程、线程和协程是操作系统中用于执行程序的基本抽象概念。它们定义了程序如何在计算机上运行,以及如何管理资源和执行任务。下面我们将详细解释这些概念,并探讨它们之间的区别和联系。

2024-12-10 17:46:12 442

原创 一文搞懂C++工厂模式设计模式

工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,创建对象的任务被委托给专门的工厂类,而不是在客户端代码中直接通过new操作符创建。这样,客户端代码就可以从具体的产品类中解耦,提高代码的灵活性和可维护性。

2024-12-10 15:38:43 324

原创 【C++】SOCI库介绍及使用指南

SOCI(Simple C++ Interface)是一个现代的、轻量级的C++数据库访问库。它为各种不同的数据库提供了统一的接口,并且支持多种数据库API,如ODBC,MySQL,PostgreSQL等。SOCI库以其易用性、灵活性和高性能而受到开发者的青睐,特别适合需要与数据库进行复杂交互的应用程序。

2024-12-10 15:16:20 659

原创 ACE之Acceptor-Connector框架介绍及使用

ACE(Adaptive Communication Environment)是一个用于构建高性能、可扩展的网络通信应用程序的C++框架。它提供了一套丰富的组件和服务,用于简化网络编程的复杂性。其中,Acceptor-Connector框架是ACE中用于处理客户端-服务器通信的核心机制。

2024-12-07 14:27:04 457

原创 RPC介绍,什么是RPC?

RPC(Remote Procedure Call,远程过程调用)是一种通信协议,它允许一个程序调用另一个程序在不同的地址空间上执行的子程序,就像调用本地函数一样。RPC机制使得开发者能够构建分布式计算系统,其中不同的组件可以分布在不同的计算机上,但它们之间可以像在同一台机器上一样相互调用。

2024-11-30 16:41:16 518

原创 ZeroMQ(ZMQ或0MQ)介绍

ZeroMQ(也称为ZMQ或0MQ)是一个高性能、异步消息传递库,可以用于分布式应用程序和网络通信中。它提供了一种简单而强大的模型来处理复杂的通信需求,支持多种传输协议和通信模式。ZeroMQ的设计目标是简单、轻量级和快速,它通过提供简洁的接口和强大的通信模式,使得开发者能够更方便地构建分布式系统和并发应用。

2024-11-30 16:37:52 490

原创 【C++并发编程】高并发的阻塞队列设计与实现

首先阻塞队列肯定是一个队列,是一种先进先出的数据结果,与一般的数据结构相比,多了阻塞两个字,对应的与普通队列不同的点如下:当队列空时,从队列中取出元素会阻塞(先等着,直到队列中有元素为止)当队列满时,往队列中增加元素会阻塞(队列有容量限制,不能无节制的往队列中增加元素)阻塞队列常用来实现生产者消费者模型。

2024-11-21 13:56:44 326

原创 Boost库介绍

Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库由Boost社区组织开发、维护。其目的是为C++程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能。Boost库使用Boost License来授权使用,根据该协议,商业的非商业的使用都是允许并鼓励的。Boost社区建立的初衷之一就是为C++的标准化工作提供可供参考的实现,Boost社区的发起人Dawes本人就是C++标准委员会的成员之一。

2024-11-20 10:19:38 675

原创 C++网络库muduo资料

muduo库笔记

2024-11-19 20:38:48 132

原创 QT打包应用程序exe文件步骤

那么这个时候,你就得知道,别人电脑的环境可能和你不一样,这时候你就得打包一个.exe文件并将其依赖项也包含进去,当然这个东西都是QT编译器就可以完成的。得确保如上图所示,安装了QT的编译器,没有这个选项的就得重新安装QT,安装的时候勾选对应的选项,查看:左下角点击开始,点击对应版本展开。单独将你的exe文件,放一个目录下,之后又上图cd进去你exe所在位置。输入:windeployqt 你的exe文件名.exe。3.采用release版本编译。1.确定已经安装编译器。

2024-11-19 14:45:31 622

原创 D*算法、D* Lite和Anytime D*的概述

Dynamic A*(D*D算法是一种增量式的路径搜索算法,适用于动态环境中的路径规划。它的设计允许在路径中断或环境变化时快速重新规划路径。D算法从目标点开始搜索,通过将目标点置于开启列表中来进行反向搜索,直到找到当前机器人的位置。该算法能够有效处理动态障碍物的出现,比如塌方或交通堵塞等情况,同时也可以在静态环境中使用,类似于Dijkstra算法和A*算法的结合。DLiteD* Lite是基于D算法和LPA算法的改进版本。它采用反向搜索的方式,假设未知区域都是自由空间,从而增量式地实现路径规划。

2024-11-16 11:22:45 696

原创 A*算法寻路算法详解+代码

A*寻路算法就是启发式探索的一个典型实践,在寻路的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中是采取估计值优先原则,估计值更优的节点会被优先遍历。其中 H:预估代码中最常见的有:欧拉距离(两点之间的直线距离计算 )H:当前代价到终点的代价(预估代价)A星算法公式:F = G + H。曼哈顿距离(横纵坐标差值的绝对值)每次选择最优值进行遍历。G:起点到当前的代价。

2024-11-13 20:17:28 267

原创 Dijkstra算法入门(一)

C++中的Dijkstra算法实现Dijkstra算法是一种用于在加权图中找到最短路径的算法。在C++中实现Dijkstra算法通常涉及创建一个图表示,然后使用贪心策略逐步确定最短路径。

2024-11-13 15:30:11 296

原创 【C++】实现线程池--通用级别,可变参模板线程池。

线程池里面的线程个数是可动态增长的,根据任务的数量动态的增加线程的数量,但是会设置一个线程 数量的阈值,任务处理完成,如果动态增长的线程空闲了60s。CPU单核 多线程存在上下文切换,是额外的花销,线程越多上下文切换所花费的额外时间也越多,倒不如一个线程一直进行计算。还没 有处理其它任务,那么关闭线程,保持池中最初数量的线程即可。线程池里面的线程个数是固定不变的,一般是ThreadPool。时间片,物理上还是串行执行的,但是由于每个线程占用的。上,多个线程是在真正的同时执行,这样的场景称作并行。线程池C++

2024-10-12 11:57:35 575

原创 [C++部分用法总结] std::future,std::function,std::packaged_task,std::forward

std::function是一个通用、多态的函数封装器。它可以存储、调用或复制任何可以调用的目标,包括普通函数、Lambda表达式、函数对象以及成员函数指针。std::packaged_task封装了一个可调用对象,并允许异步地获取其结果。它通常与std::thread和std::future一起使用。std::forward用于完美转发参数。这对于编写泛型代码和保持移动语义非常重要。std::future用于从异步操作中获取结果。它通常与std::promise或std::async一起使用。

2024-10-11 17:18:51 345

原创 [C++细节]:析构函数弄成纯虚,避免创建实例

在多态场景中,如果通过基类指针删除派生类对象,而基类析构函数不是虚函数(或不是纯虚函数但没有在派生类中重写),那么只会调用基类的析构函数,而不会调用派生类的析构函数。是的,在C++中,将析构函数声明为纯虚(pure virtual)函数的主要目的确实是为了避免创建该类的实例。纯虚函数是一种特殊的虚函数,它在基类中声明但没有定义,要求派生类必须提供具体的实现。如果基类析构函数是纯虚的,那么通过基类指针删除派生类对象时,将确保调用正确的析构函数链。:抽象类通常用作派生类的基类,为派生类提供接口或共同行为。

2024-10-10 16:42:26 185

原创 expected class-name before ‘{‘ token错误及解决

1.前置声明:在使用到类的定义前面 声明一下。4.类中定义了对象的可以改为引用或者指针。2.重构代码,以避免循环依赖问题。仅供参考,具体情况还得具体分析。3.更改头文件包含顺序。

2024-09-20 15:41:14 444

原创 C++成员函数模板的定义和使用。

成员函数模板的定义通常应该放在头文件中,以确保模板定义在编译时对所以可能的模板类型都是可见的如果将模板定义在.cpp文件中,可能会导致链接器错误,因为在编译使用模板源文件时可能找不到模板的定义因为它们位于同一个编译单元中,编译器在编译该单元时能够同时看到两者的定义。然而,为了在其他编译单元中使用模板,必须确保模板的定义在编译时是可见的。这通常通过将模板定义放在头文件中,或者使用包含机制来实现。

2024-09-07 16:06:58 296

原创 TCP/IP【保活机制】

TCP保活机制是一种检测TCP连接对端是否仍然可达的机制。当一方(通常是客户端)怀疑对端(服务端)可能已经奔溃或变得不可达时,它可以发送保活探测包(通常是一个空的TCP段,仅包含TCP头)来检查对端是否仍然响应。例如,在较旧的 Linux 版本中,这个选项可能不存在,或者需要使用不同的方法来配置探测次数。这些设置将影响通过该套接字建立的 TCP 连接的保活行为。如果它们对您的应用程序不是必需的,或者您不确定如何配置它们,请小心使用。在使用这些选项之前,请检查您的系统文档和内核版本,以确保它们可用。

2024-09-04 20:16:51 475 2

原创 C++【线程局部存储TLS机制】动态TLS

类利用了操作系统提供的TLS机制,确保了每个线程都有自己的独立存储空间,从而实现了线程之间的数据隔离。这就是为什么每个线程都能有自己的副本,并且不会影响其他线程的副本。设置值时,这个值只会被存储在该线程的TLS空间中,对其他线程是不可见的。因此,每个线程看到的都是自己的值,而不是其他线程设置的值。指定的销毁函数(destructor),来清理线程的TLS空间。线程局部存储(TLS)的关键在于每个线程都有自己的存储空间,这个空间对于其他线程是不可见的。:由于每个线程都有自己的TLS空间,所以当一个线程通过。

2024-09-04 20:03:14 376

原创 C++ Linux下【fd_set】的封装

其中每一个数组元素都能与任意一个打开的句柄(socket句柄、文件、命名管道、设备句柄等)建立联系。但是这种建立联系的工作是必须由程序员自己去完成的。一个long类型的数组,提供给select()机制使用的一种数据结构。主要功能是建立联系。以上代码为自己项目中的实现,可以根据自己的想法来实现,仅供参考。下面实现C++代码,看代码中的注释即可。

2024-07-31 19:25:59 302 1

原创 【日志管理宏】C++实现,快速定位问题。

因此,一个健全的日志管理机制是软件开发项目中不可或缺的一部分。日志管理在软件开发项目中扮演着至关重要的角色。【日志管理宏】C++实现,快速定位问题。日志管理在软件开发项目中扮演着至关重要的角色。

2024-07-16 20:13:39 422

原创 【RAII机制】的使用方法及优势

在上面的示例中,ScopedLock 类通过RAII机制封装了互斥锁,使得在 safeFunction 函数中无需手动管理锁。:通过封装锁的对象,在对象构造时自动加锁,在对象析构时自动解锁。5.代码清晰:RAII锁的使用使得代码更加清晰,因为锁的管理被封装在对象内部,而不是散落在函数的各个角落。下面是一个使用RAII锁的简单示例,以及一个不使用RAII锁(即普通锁)的对比示例。3.简洁的代码:减少了资源管理相关的样板代码,提高了代码的可读性和可维护性。RAII与普通的锁(以互斥锁为例)的区别。

2024-07-16 17:58:44 469

原创 谈谈C++软件开发实习生在项目中踩过的坑

项目中应该注意的点,比如你是中间插入进来的,团队中的人都使用 "helloWorld" 这种驼峰式命名变量,但是你写的代码就是 "hello_world" 下划线命名变量。虽然说这个东西大家都不会太强调,但是遇到一个好导师的导师会指定你,告诉你那些代码的行为规范需要注意,毕竟不是你一个人写的代码,是整个团队开发的,不可能说到后面开发完了找一个问题,找半天,最后定位到自己写的屎山代码里,发现大佬看不懂,你自己也看不懂了。虽然很基础,但是也是需要多多注意的,因为细节这玩意,是长期养成的,得引起重视。

2024-07-15 20:04:14 578

原创 Linux下sleep函数报错及解决

可能是我的项目中有命名空间冲突,加上之后项目能正常运行。我这个问题可能只针对一些项目中命名空间冲突引起的问题,希望能帮助到您!请确保头文件的包含window下的头文件为#include Linux下的头文件为#include 。我的源代码,TimeUtils类为工具类,工具类:本身不会被实例化,它的所有功能都是通过静态成员(静态方法和静态变量)提供的。请看下面的解决办法】原因:这样子编写会报错,因为我做的项目是库,库里面很多自定义的命名空间。

2024-07-13 15:49:54 400

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除