
C++
文章平均质量分 73
F-Halcon
这个人不贼懒......
展开
-
在封装DLL时,避免第三方命名空间的依赖方法[PIMPL模式技术指南]
PIMPL(Pointer to IMPLementation)模式是C++中实现信息隐藏和二进制兼容性的重要设计范式,通过创建实现细节的私有封装层,有效隔离接口与实现。本文档详细阐述其核心原理、现代实现方式和典型应用场景。原创 2025-04-11 21:29:56 · 526 阅读 · 0 评论 -
【实际项目分享】多相机取图存图问题
极致并发性能:通过固定索引隔离线程写入路径,避免锁竞争灵活扩展能力:支持动态增减相机数量(需配合配置服务)低资源消耗:内存占用减少40%(相比全局互斥锁方案)容错性保障:每个相机的存储空间独立,单点故障不影响整体系统。原创 2025-04-11 20:57:43 · 416 阅读 · 0 评论 -
[C++] 参数方向标记 接口描述宏
在C++中,参数方向标记是一种通过宏定义显式标注函数参数用途的编程实践。通过合理选择参数标记方案,可在代码可读性和维护性之间取得平衡,尤其在大型项目中效果显著。简单函数中过度使用可能使代码冗余,需结合注释或文档工具补充说明。通过规范宏标记,避免对输入参数误修改或未初始化输出参数的使用。宏定义不增加运行时开销,仅作为静态标记,适合性能敏感场景。宏标记无语法约束,若错误标注(如将输入参数标为。统一宏命名(如Windows API中的。可能被其他库占用),需团队统一规则。一、参数方向标记的实现原理。原创 2025-03-13 09:54:48 · 343 阅读 · 0 评论 -
关于C++中Debug/Release版本差异
文件(Windows)或嵌入调试符号(Linux),包含变量名、函数名和行号信息,便于断点调试。建议开发阶段使用Debug版本定位问题,发布时切换至Release模式并验证跨平台行为。Debug模式下运行会因断言失败崩溃,Release模式下跳过断言直接输出。),保留完整函数调用栈和变量初始化(如未初始化变量填充。),可能内联函数、删除未使用变量,但可能导致调试困难。一、C++中Debug与Release版本的区别。移除调试信息,文件体积更小,且不生成。原创 2025-03-10 19:42:56 · 865 阅读 · 0 评论 -
API和SDK
API:是一组预先定义的函数、协议和规范,用作不同软件系统之间的接口,允许应用程序相互交互和通信。SDK:是一个更全面的工具包,包含开发软件所需的各种工具、库、文档和相关文件。原创 2025-03-06 20:41:56 · 243 阅读 · 0 评论 -
C++指针避坑总结
指针的使用需要非常小心,常见的错误包括空指针解引用、内存泄漏、重复释放、野指针、非法内存访问、悬空指针和指针类型不匹配。始终检查指针是否为nullptr。动态分配的内存要及时释放。避免重复释放内存。释放内存后将指针置为nullptr。确保指针访问的内存是合法分配的。避免强制转换不兼容的指针类型。通过这些简单的规则,可以有效避免指针相关的致命错误。原创 2025-03-06 20:33:34 · 882 阅读 · 0 评论 -
C++20中的std::format
需启用C++20标准并包含头文件。运行时动态格式字符串。原创 2025-03-04 16:29:05 · 758 阅读 · 0 评论 -
C++ 跨平台DLL封装示例(含命名空间与继承结构)
源文件(MyDll.cpp)原创 2025-02-21 12:00:00 · 350 阅读 · 0 评论 -
C++自定义函数默认参数使用指南
默认参数只能在函数声明或定义中指定一次,不能同时在声明和定义中设置。默认参数必须从右向左连续设置,未指定默认值的参数不能出现在右侧。参数按从左到右顺序赋值,无法跳过中间参数。默认参数可能引发与重载函数的歧义调用。C++自定义函数默认参数使用指南。原创 2025-02-21 09:00:00 · 411 阅读 · 0 评论 -
一种图像小面积缺陷放大的方法分享
将图像的每个像素点(i,j)的值复制到新图像的四个位置:(i,j)、(i,j+1)、(i+1,j)、(i+1,j+1)。这样原图的每个像素变成2x2的块,从而实现长宽各放大两倍,小面积缺陷放大两倍。原创 2025-02-19 09:00:00 · 472 阅读 · 0 评论 -
【C++】线程封装与守护监控线程实现
本文将介绍如何通过二次封装来管理线程,以及如何利用守护线程机制监控多个线程的状态,确保程序的稳定性和高可用性。在复杂的应用场景中,直接使用 std::thread 来创建线程虽然简单,但其灵活性有限。实际应用往往需要对线程进行更精细的控制,例如设置线程优先级、CPU 亲和性,以及对线程状态进行管理等。为解决这些问题,我们对 std::thread进行了二次封装,通过引入 WorkerThread 类和 DaemonThread 类,实现了线程的高效管理和稳定运行。原创 2025-02-18 08:45:00 · 703 阅读 · 0 评论 -
封装DLL避免第三方依赖的五大核心方法
目录一、方法代码示例1. 接口抽象与PIMPL模式2. 类型转换适配层3. 动态库加载隔离4. 二进制接口控制5. 资源封装规范二、Halcon+OpenCV工业检测DLL完整实现(C++17)1.项目结构2.核心实现代码2.1 接口定义(跨平台标准)2.2 Halcon2.3 OPenCV三、调用示例代码四、部署注意事项原创 2025-02-18 09:00:00 · 484 阅读 · 0 评论 -
PLC通信交互系统技术分享
这是一个C++程序,用于与西门子PLC进行通信,处理SN码、拍照信号、检测结果等流程。代码中使用了状态机,通过不同的状态来管理交互步骤。原创 2025-02-17 13:56:30 · 820 阅读 · 0 评论 -
用C++实现点到三角形最小距离的计算
【代码】用C++实现点到三角形最小距离的计算。原创 2025-02-16 21:49:59 · 244 阅读 · 0 评论 -
【项目问题】连通域排序和自由选取
连通域按面积排序允许自定义面积区间筛选连通域自定义选取排序后的区域范围// 调用示例:筛选面积50-200的区域0, 8);// 默认选取前9个// 调用示例:选取排序后的第3-7名(索引2-6)0, INT_MAX, // 不限面积区间2, 6);// 选取第3到第7个区域。原创 2025-02-16 21:34:05 · 313 阅读 · 0 评论 -
ubuntu系统Valgrind工具的使用
1块共1,024字节。原创 2025-02-14 10:12:46 · 603 阅读 · 0 评论 -
C++ 通过XML读取参数
方法2(一次性读取一个节点中的所有参数,然后调用一次函数)是最推荐的方案,因为它在性能和可维护性之间取得了较好的平衡。如果文件后期确实会非常大(如超过100MB),可以考虑进一步优化,例如分批处理节点,或者采用流式解析(如XMLReader)来减少内存占用。原创 2025-02-10 21:25:26 · 1132 阅读 · 0 评论 -
C++如何解决头文件循环引用问题?
优先使用前向声明:当只需要指针或引用时,前向声明是最简单的解决方案。合理拆分头文件:将相关的声明放在同一个头文件中,避免在头文件中包含不必要的其他头文件。使用接口抽象:通过抽象接口解耦具体实现,遵循依赖倒置原则。实现逻辑放在cpp文件:头文件只包含声明,具体实现放在cpp文件中。使用PIMPL模式:对于复杂的类,考虑使用PIMPL模式,可以完全隐藏实现细节,提供更好的ABI兼容性。通过这些方法,可以有效地解决C++中的头文件循环引用问题,并提高代码的可维护性和编译效率。原创 2025-02-08 22:09:23 · 581 阅读 · 0 评论 -
【C++】如何快速释放 vector 占用内存?
在C++编程实践中,作为一种灵活且高效的动态数组容器,广受欢迎。它能根据需求动态调整存储空间,但值得注意的是,当元素移除或容器清空后,其预留的内存容量(capacity)不会自动缩减。若对此现象不加留意,在频繁操作的情况下,可能会导致程序内存占用持续攀升,影响性能。本文旨在探讨两种有效手段——利用成员函数与swap技巧,来迅速释放占用的多余内存,同时分析这两种方法的适用情境及实施的最佳策略。原创 2024-12-01 07:00:00 · 1355 阅读 · 0 评论 -
C++ 的 visit 函数介绍
函数通常与访问者模式(Visitor Pattern)相关联,这是一种行为设计模式,用于将数据操作与数据结构分离。然而,在C++20中,中当前存储的值应用一个可调用对象(如函数、函数对象、lambda表达式等)。是一个类型安全的联合体,可以存储多个类型中的一个,但一次只能存储一个值。)中对应的重载函数。中当前存储的类型,选择并调用可调用对象(在本例中是。在这个示例中,我们定义了一个。,并给它赋了不同的值。的一部分,用于处理变体类型(然后,我们创建了一个。当前存储的类型调用相应的。的工作原理是,它根据。原创 2024-11-22 07:15:00 · 420 阅读 · 0 评论 -
【C++】内联函数
因此,在使用内联函数时,需要谨慎考虑函数的复杂性和调用频率。:如果函数内部不包含复杂的控制流(如大量的条件判断、循环等),则更适合作为内联函数。:如果函数是库函数,并且经常更新和维护,则不适合将其声明为内联函数。因为内联函数在编译时展开,每次更新库函数都需要重新编译所有调用该函数的代码,增加了维护成本。:尽管内联函数可以提高性能,但过度使用会导致代码膨胀,增加程序的内存占用和二进制文件的大小。:如果函数内部包含复杂的控制流和循环,内联化后的代码会变得非常庞大和复杂,增加程序的调试和维护难度。原创 2024-11-22 07:00:00 · 658 阅读 · 0 评论 -
【C++】深拷贝 浅拷贝
浅拷贝(Shallow Copy)与深拷贝(Deep Copy)是计算机科学中用于复制对象或数据结构时的两种不同策略。它们之间的主要区别在于复制过程中是否仅复制对象本身,还是连同对象所引用的其他对象或数据也一并复制。原创 2024-11-21 07:30:00 · 807 阅读 · 0 评论 -
类和结构体的区别
C中的struct在C语言中,struct主要用于将不同类型的数据组合成一个单一的数据类型。它不能包含函数,只能描述一个对象的状态,不能描述一个对象的行为。C++中的class与struct在C++中,class是面向对象编程的核心概念,允许定义自己的数据和操作这些数据的函数。struct在C++中被扩展,可以包含函数,从而具有状态(属性)和行为。状态保存在成员变量中,行为通过成员方法(函数)来实现。原创 2024-11-16 10:00:00 · 469 阅读 · 0 评论 -
C++中的std::tuple和std::pair
std::pair和std::tuple都是C++标准库中用于组合多个值的模板类,但它们在成员数量、命名和灵活性方面有所不同。std::pair适用于存储两个相关值的场景,而std::tuple则更加灵活,可以存储任意数量和类型的值。在实际编程中,可以根据具体需求选择合适的模板类来使用。原创 2024-11-15 08:00:00 · 852 阅读 · 0 评论 -
C++从入门到成神秘籍(-)
嘿,各位C++大佬们,你们是否已经整装待发,准备踏上一段激动人心的编程之旅?今日,我们将深入C++领域的两大守护神器:编译时校验与运行时监控!它们如同前瞻智者与贴身护卫,为你的代码筑起坚不可摧的防线!亲爱的C++总工们,是否厌倦了那些仅在运行时才显露真身的错误?是否渴望拥有预知未来的能力?现在,就让我们携手踏入编译时的神秘领域,掌握那些能在代码执行前便揪出并消灭隐患的神奇技巧!是不是听起来就让人跃跃欲试?握紧你的智慧之剑(键盘),我们的奇幻之旅即将启程...还在依赖传统的const吗?原创 2024-11-12 07:00:00 · 818 阅读 · 0 评论 -
C++内存管理
unique_ptrunique_ptr是一个独占所有权的智能指针,意味着一个unique_ptr实例拥有其所指向的对象,并且该对象不能被其他unique_ptr实例所共享。当unique_ptr被销毁时,它所指向的对象也会被自动删除。代码示例// 创建一个unique_ptr,指向一个int类型的动态分配对象// unique_ptr不能复制,但可以移动// 错误:不允许复制// 正确:移动语义// 此时ptr1不再拥有对象,ptr2拥有if (!ptr1) {原创 2024-11-11 07:45:00 · 877 阅读 · 0 评论 -
岛屿数量问题
给一个0 1矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。岛屿问题: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。原创 2024-11-09 07:30:00 · 266 阅读 · 0 评论 -
C++ 参数传递 笔记
在C++的舞台上,"移动"对象这出戏确实是一场值得一看的表演。通过实现移动构造函数和移动赋值运算符,并合理使用std::move函数,我们可以高效地传递和返回大型对象,从而提升程序的性能。但请记住,移动语义是一把双刃剑;在使用它时,我们需要小心谨慎地处理对象的状态和资源管理问题。在C++中,您所展示的代码片段巧妙地运用了移动语义来优化性能。然而,这里有一些细微之处和潜在陷阱需要注意。// 直接“偷”走name的内容// result也会被移动返回,效率极高!// 使用示例。原创 2024-11-08 21:26:56 · 1046 阅读 · 0 评论 -
C++ Double Dispatch,即双重调度
对于初次接触或曾有所闻但未曾深入了解的开发人员而言,调度(Dispatching)这一概念值得我们深入探讨。调度,从字面意义上理解,即将某物发送至特定目的地。在C++编程中,调度同样指将控制权从一处转移至另一处,例如从主方法调用函数或方法时,程序会跳转至新的地址空间并执行该方法。这一过程即称为调度。根据方法调用的性质,调度可分为静态调度(Static Dispatch)和动态调度(Dynamic Dispatch)。原创 2024-11-09 07:00:00 · 860 阅读 · 0 评论 -
C++ EBO介绍
EBO,在 C++ 中是“Empty Base Optimization”(空基类优化)的缩写,这是一种优化技术,旨在减少因继承空基类(即不含任何数据成员的类)而产生的潜在内存开销。然而,按照常规的对象布局规则,即使是空的基类,也可能会占用一定的内存空间(通常是为了确保对象的唯一地址),这可能导致继承自空基类的派生类对象的大小超出预期。这意味着,如果有一个空的基类以及一个从该基类继承的派生类,派生类的实例可能不会因为继承了空基类而增加任何额外的内存开销。类型的成员)决定,因此。的大小可能与一个单独的。原创 2024-11-08 20:00:00 · 499 阅读 · 0 评论 -
特征检测与特征匹配方法笔记+代码分享
在一幅图像中,总能发现其独特的像素点,这些点可以被视为该图像的特征,我们称之为特征点。在计算机视觉领域中,基于特征点的图像特征匹配是一项至关重要的任务,因此,如何定义并识别一幅图像中的特征点显得尤为重要。本文旨在总结计算机视觉领域中最常用的几种特征点及其特征匹配方法。在计算机视觉领域,兴趣点(亦称关键点或特征点)的概念已被广泛采纳,应用于目标识别、图像配准、视觉跟踪、三维重建等多个方面。原创 2024-11-07 14:18:00 · 1590 阅读 · 0 评论 -
直方图规定化
直方图规定化是图像处理领域中的一项关键技术,它通过应用灰度映像函数,将原始图像的灰度直方图转换为期望的特定形状,从而达到优化图像的目的。原创 2024-11-07 11:17:39 · 1073 阅读 · 0 评论 -
有限状态机
有限状态机(Finite State Machine, FSM)是一种强大的数学模型,旨在建模和阐述系统行为。它详细说明了系统如何依据当前状态与外部输入来转变状态,以及在特定状态下可能产生的输出结果。FSM在多个学科领域均展现出广泛的应用价值,包括计算机科学、电子工程、语言学、生物学、数学以及逻辑学等。原创 2024-11-07 11:06:47 · 493 阅读 · 0 评论 -
工业相机常用功能之白平衡及C++代码分享
白平衡(White Balance),这一摄影领域的专业术语,其核心概念在于“无论处于何种光源环境下,都能确保白色物体被真实还原为白色”。在实际拍摄过程中,面对特定光源所造成的色彩偏移现象,白平衡技术通过增强相应的补色来进行色彩补偿,从而实现对色温偏差的精确校准。人类视觉系统具有惊人的适应性,能够在多种色温的光源下准确识别并校正白色物体,使其始终呈现为正白色。然而,相机的感光元件(sensor)却并不具备如此强大的适应性。原创 2024-11-07 10:23:19 · 1803 阅读 · 0 评论 -
C++ 如何正确地将字符串转换为大写或小写
当你开发一个应用程序时,需要将字符串转为小写形式。于是,你写下了的代码。原创 2024-11-07 09:57:57 · 560 阅读 · 0 评论 -
OpenCV C++ 计算两幅图像之间的多尺度结构相似性(MSSIM)
MSSIM由德州大学奥斯丁分校的图像和视频工程实验室提出,作为SSIM的扩展,它旨在更全面地评估图像的相似度。SSIM本身是一种衡量两幅图像相似度的指标,它考虑了图像的亮度、对比度和结构三个因素。而MSSIM则在此基础上,通过在不同尺度上对图像进行降采样和滤波,然后计算每个尺度上的SSIM,最后将这些SSIM值进行加权平均,得到最终的MSSIM值。原创 2024-11-06 20:59:52 · 1312 阅读 · 0 评论 -
Halcon打开多个窗口,指定窗口显示指定内容
dev_set_window (WindowHandle1),先设置指定窗口句柄即可。* Halcon打开多个窗口,指定窗口显示指定内容。原创 2024-11-06 19:30:00 · 652 阅读 · 0 评论 -
C++ 内存对齐:alignas 与 alignof
内存对齐是指数据在内存中按照特定的字节边界存储。一般情况下,处理器从内存读取数据时会更高效地读取对齐的数据。如果数据未对齐,处理器可能需要进行额外的内存访问,导致性能下降。对于某些平台,不对齐的内存访问甚至可能引发未定义行为。通常,C++ 编译器会根据目标平台自动对变量进行内存对齐,确保类型的内存地址是适当的对齐边界。但有时,开发者需要对内存对齐进行精确控制,比如优化性能、与硬件设备交互等场景,这就是alignas和alignof的用武之地。原创 2024-11-04 20:45:00 · 2026 阅读 · 0 评论