
C++
文章平均质量分 62
蜉蝣之翼❉
这个作者很懒,什么都没留下…
展开
-
C++ 高效统计函数运行时间
手动计时:灵活,但代码冗余较多。RAII定时器类:可以自动化统计时间,推荐使用。宏:最简洁的方法,方便直接在代码中随处使用。a.你想要封装更复杂的时间统计工具,比如统计多次函数运行的平均时间吗?b.是否希望将这些统计结果保存到日志文件中?为了解决a.(统计多次函数运行的平均时间)和b.统计多次函数运行的平均时间:需要在一个函数多次运行时,记录每次的运行时间,并计算出平均时间。保存到日志文件:可以通过<fstream>库将统计的运行时间结果输出到一个日志文件中。原创 2025-01-02 10:42:26 · 967 阅读 · 0 评论 -
c++ 简单线程池
头文件cppreturnType>>解释。原创 2024-07-03 17:20:35 · 1095 阅读 · 0 评论 -
nlohmann json C++ 解析
联合体用于高效存储不同类型的 JSON 值。定义一个枚举来表示 JSON 值的类型。原创 2024-05-28 17:59:08 · 1107 阅读 · 0 评论 -
C++ 结构体内存对齐
最开始计算Cmd_t大小时 ,我以为是7bytes. 后来发现C++ 结构体在这里右4字节对齐。但是由于 将 pdata + 1 解释为 Cmd_t* 类型的指针,并将其赋给 data 成员。在实际使用中,看见前人的代码是,new 一块内存放两个结构体。我对内存大小有些疑惑。相当于 Cmd_tag.data 和 Cmd_t.ua公用一个字节的内存。一开始我以为,new一块内存存放她两需要 2+8 =10 bytes。结构体 Cmd_t 需要 8 bytes。结构体 tag_t需要2 bytes。原创 2024-05-15 10:53:49 · 406 阅读 · 0 评论 -
缩放算法优化步骤详解
在最里层的循环里面,每次都要计算 row / fYZoom 和 column / fXZoom,这个实际上可以挪出for循环,计算一次存到数组里。我们知道sse128可以一次性处理4个int类型,所以我们把最后一层for循环改成,4个坐标的算法,不满4个的单独计算。这个指令是使用1个i,来设置__m128i,将__m128i看做4个32位的部分,则每个部分都被赋为i;根据比例计算原图和缩放后图坐标的对应关系:缩放后图坐标*缩放比例 = 原图坐标。上面 一次处理四个坐标的代码要改成sse的代码。原创 2024-03-08 17:14:59 · 1797 阅读 · 0 评论 -
SIMD学习笔记2:高斯卷积计算优化
【代码】SIMD学习笔记2:高斯卷积计算优化。原创 2024-02-06 17:12:04 · 1029 阅读 · 0 评论 -
SIMD学习笔记1
参考 http://const.me/articles/simd/simd.pdf示例:对4个数字求平方使用SIMD。原创 2024-02-06 17:04:32 · 710 阅读 · 0 评论 -
C++ 模板 Traits
运行结果很明显 当T为char类型是结果错误。打印累加过程看看:发现问题出在:char类型的取值范围是 -128 ~ +127,输出是: 127 -128 -127所以累加函数,当T为char类型时,T total{};代码的需要改成因为char类型的数据做累加的时候太容易超出取值范围,而产生数字溢出的错误了。原创 2024-01-19 15:03:47 · 615 阅读 · 0 评论 -
结构体内存泄漏,vs诊断工具
在排查问题时,你可以使用内存分析工具,例如Valgrind或Visual Studio的内存调试工具,来跟踪内存分配和释放的情况,以找出内存泄漏或异常分配的原因。在调试过程中,打开vs的诊断工具,发现大量std::_Container_proxy[] 的实例,定位到struct S代码。确保你对容器的使用是正确的,避免不必要的动态内存分配。这样的内存清零函数。相反,可以使用合适的初始化方式,或者直接调用对象的构造函数。对象是一个传入的引用参数,通常可以在调用函数时确保传入的对象是有效的,无需使用。原创 2024-01-17 16:52:08 · 1380 阅读 · 0 评论 -
C++写二进制文件
【代码】C++写二进制文件。原创 2024-01-16 16:07:16 · 1064 阅读 · 0 评论 -
google test : 测试已有项目(模板类)
项目结构如下:greenNoiseMask 是原有项目在解决方案中添加google test 项目:sample-test2。原创 2023-12-21 15:57:53 · 829 阅读 · 0 评论 -
随机迷宫C++
【代码】随机迷宫C++原创 2023-12-11 11:21:38 · 357 阅读 · 0 评论 -
柏林噪声C++
随机噪声如上图所示随机噪声没有任何规律可言,我们希望生成有一些意义的局部连续的随机图案。原创 2023-12-07 11:36:53 · 1548 阅读 · 0 评论 -
绘制纹理C++
用数学和C++绘制一些纹理。原创 2023-12-05 15:34:41 · 615 阅读 · 0 评论 -
学习代码PerlinNoise
所以在这个例子中,模板参数URBG被std::random_device所赋值,std::random_device满足可调用、返回无符号整数的要求,所以可以成功实例化构造函数。这个模板的参数URBG必须是一个可调用的类型,调用后返回无符号整数,只有满足这两个条件,这个模板才能够正常实例化,否则实例化失败。这里对构造函数进行了实现,使用了模板参数声明中的条件来限制实现的条件。,它可以接受任意类型的迭代器和随机数引擎,并对指定范围内的元素进行洗牌操作。函数的作用是对指定范围内的元素进行洗牌操作。原创 2023-12-05 15:30:11 · 394 阅读 · 0 评论 -
埃尔米特插值(hermite 插值) C++
为了可视化效果可以把结果写到HermiteInterpolator.txt。原创 2023-11-22 12:03:42 · 1464 阅读 · 0 评论 -
C++: int转换成LPCSTR
在上面的代码中,sprintf函数可以将int类型转换为字符串类型,然后将字符串类型赋值给一个char类型的数组str。最后,将str指针转换为LPCSTR类型的指针lpcstr。当不想使用sprintf的方法时,可以使用C++标准库中的std::to_string函数将int类型转换为字符串类型,然后再将字符串类型转换为LPCSTR类型。在上面的代码中,std::to_string函数可以将int类型转换为字符串类型,然后使用c_str()方法将字符串类型转换为LPCSTR类型。原创 2023-11-21 14:08:05 · 1282 阅读 · 0 评论 -
基于B样条的FFD自由变换原理与C++实现
基础类BaseFFD。原创 2023-11-03 16:27:07 · 741 阅读 · 0 评论 -
缩放打印文件(prt,prn)
图片的宽度为nImageWidth,那么文件这一行的长度为:(nImageWidth * nImageColorDeep+7)/8。也就是说我们看见的图片的每一行对应打印文件的四行,每2位代表一个颜色。注意:读文件时,首先需要解析文件头,如上。打印机支持的文件为 prt 或者prn。这里介绍如何缩放打印文件。因为文件必须为 8位对齐。原创 2023-11-02 09:58:18 · 925 阅读 · 0 评论 -
OutputDebugString 输出时间
在C++ debug模式下,一些集成开发环境(IDE)也提供了自带的控制台输出窗口来显示程序的运行结果。在Visual Studio中,可以使用函数将输出信息打印到“输出”窗口。原创 2023-09-18 11:35:14 · 816 阅读 · 0 评论 -
有指针或者多维数组时,如何写 拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符
当成员变量里面有指针或者多维数组时,如何写 拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符头文件实现main运行结果。原创 2023-08-31 17:57:07 · 551 阅读 · 0 评论 -
move 与 析构函数
move 与 析构函数原创 2023-08-23 16:29:55 · 880 阅读 · 0 评论 -
使用 Visual Studio GoogleTest编写 C/C++ 单元测试——入门篇
Visual Studio 新建 GoogleTest项目,一路选默认参数。原创 2023-08-15 14:37:40 · 3917 阅读 · 0 评论 -
生产者消费者模型 C++ 版
生产者消费者模型 C++原创 2023-08-10 11:26:31 · 1255 阅读 · 0 评论 -
C++ 性能优化
通过分析算法的执行次数和输入规模之间的关系,可以确定算法的大O复杂度,从而选择更高效的算法。:在进行优化后,务必进行全面的测试和验证,确保代码的正确性和性能的提升。:一些简单的代码优化可以带来明显的性能改进,如减少循环中的计算量、消除不必要的判断和条件分支、减少函数调用等。:使用适当的注释、空行和缩进,将代码划分为逻辑清晰的模块,提高代码的可读性和可维护性。:添加必要的注释来解释代码的目的和逻辑,尤其是复杂的算法或关键的代码段。:遵循统一的代码风格,如缩进、括号的使用等,使代码更易于理解和阅读。原创 2023-08-04 10:10:57 · 1349 阅读 · 0 评论 -
二维网格划分 LRU缓存设计
如果以后有这种情况,SrcDataCacheMap的类型要改成 std::unordered_map数据索引为网格中的位置(x,y),即:给定int xStart, int yStart, int width, int height, 计算给定数据块占整个空间哪些网格。注意: 因为本人 网格划分 与 文件划分保持一致,所以不存在一个位置有多个block的情况。双向链表LRULinkedNode。LRUCache设计。原创 2023-08-04 09:38:58 · 1363 阅读 · 0 评论 -
C++lambda表达式
先来一个简单的例子#include<iostream>using namespace std;int main(){ auto basic_lambda = [] {cout << "Hello Lambda" << endl; }; //定义简单的lambda表达式 basic_lambda(); //调用}再来一个复杂的例子#include<iostream>using namespace std;int main(){ in原创 2021-11-16 10:46:38 · 773 阅读 · 0 评论 -
虚函数实际应用
用户需要设定规则,我们根据用户输入的数值判断是否符合规则。示例一:用户认为满足如下条件的属于合格品:(数字我随便敲的)现在来了一批样品,得到了属性width等的数值。要判断样品是否合规。原创 2022-10-13 10:30:35 · 998 阅读 · 0 评论 -
结构体采坑memset(狗血教训)
2、memset让非POD崩溃的根本原因,是把里面的数据(例如虚函数表),即指向虚函数表的指针置null,导致后续的一些函数调用会访问到非法内存,这才是崩溃的根本原因。如果是结构体数组:struct sample_struct TEST[10];1、memset只适用于POD类型结构。对非POD类型,用构造函数来初始化。不要用memset处理非POD对象!首先我定义了一个结构体。原创 2022-10-11 09:30:31 · 1240 阅读 · 0 评论 -
基于C++的开源库dxflib 解析dxf文件
工作原理:dxflib分析DXF文件,然后调用用户定义的回调函数。用户可以在回调函数中处理各种实体,或者将它们保存到容器中。原创 2022-09-19 08:58:09 · 7137 阅读 · 6 评论 -
C++ 单例模式
单例模式实现原创 2022-07-29 09:01:35 · 1215 阅读 · 0 评论 -
C++ struct内部定义函数
struct 内部定义函数,重载运算符,构造函数原创 2022-07-27 14:36:43 · 2026 阅读 · 0 评论 -
C++ goto用法
在指令流结束的位置插入一条halt指令表示终止.这样就一次指令循环中只有一次无条件跳转.性能上能获得一定的提高.之前在我自己写VM的时候做profile,发现在switch和while上至少消耗了12%的性能,改用goto后获得了7%的性能的提升.在这一点上goto还是有一定的意义的.链接https//www.zhihu.com/question/27922046/answer/73347171。商业转载请联系作者获得授权,非商业转载请注明出处。...原创 2022-07-19 09:17:08 · 1492 阅读 · 0 评论 -
C++ primer 查漏补缺六:左值和右值
4.1 章简单来说:左值可以位于赋值语句的左侧,右值不行C++ 里面这个问题比较复杂,我们结合运算符一个个看赋值运算符 : int a =1;左值作为左侧运算对象,结果是一个左值取地址符: 取地址符作用于一个左值运算对象,返回一个右值(指针)而 内置解引用 , 下标 , 迭代器解引用 , string vector的下标 求值结果都是左值内置类型和迭代器的递增递减运算符作用于左值运算对象,结果也是左值右值引用(rvalue reference): 必须绑定到右值的引用。我们通过&&而不是&来获得右值原创 2022-07-08 15:33:10 · 390 阅读 · 0 评论 -
C++ primer 查漏补缺五:字符串和向量
string::size_type 是无符号类型但是我编程的时候完全没有意识到这一点,都是用 int 型赋值的,可能会出错字符字面值字符串字面值就是C风格的字符串,和std::string不一样,不是一种类型:它是字符串放在字符数组中,并以空字符结束( ‘\0’ )我们用C风格的字符串初始化 std::string时,会把最后的空字符去掉上面直接把 C风格的字符串相加(“a” + “c”)是没有意义的,需要使用 strcpy 或 strcatstd::string 重载了 +运算符,将返回strin原创 2022-07-08 14:15:16 · 216 阅读 · 0 评论 -
调用cmd 进程通信
创建进程STARTUPINFO结构体说明以上的做法有个问题,就是界面会一直卡在这里解决办法:在主线程中开一个线程(线程1):创建子进程在线程1中再开一个线程读取日志返回到界面原创 2022-06-21 10:59:36 · 304 阅读 · 0 评论 -
C++ primer 查漏补缺二 :无符号数
自动类型转换:当算数表达式中, 既有int又有无符号类型时,int会直接转换成无符号类型参考 机器数、真值、原码、反码和补码、大端方式 and 小端方式(数据的存储方式)计算机中的数都是一串 0 1无符号数它没有正负之分。计算机中无符号数没有原码、反码和补码。因为,无符号数在计算机中直接将数字化成二进制然后存储在对应的存储器或者寄存器中。 这时寄存器或者存储器的位数就可以表示数值的范围,通常情况下一个数占一个字节,8位二进制,则这8位二进制都可以表示数字的取值, 所以它的取值范围是0-255,其中最小的原创 2022-06-15 11:44:36 · 226 阅读 · 0 评论 -
C++ primer 查漏补缺 一
第一章问题什么是关联的缓冲区(buffer)缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。计算系统的I/O通常非常复杂,由多个抽象层组成。每个这样的层可能会引入一定量的开销。数据缓冲是一种通过最小化系统两层之间执行的单个事务的数量来减少这种开销的方法CPU/内存系统级缓冲(缓存):对于非常高的活动,即使是计算机的随机访问内存系统也可原创 2022-06-08 15:28:00 · 140 阅读 · 0 评论 -
qt踩坑史:qt槽函数崩溃问题
我有一个槽函数是这么写的特点是槽函数运行事件比较长,需要几秒钟。频繁地点击可能会崩溃connect(m_ui.RefreshButton, SIGNAL(clicked()), this, SLOT(SlotRefreshButtonClicked()));void A::SlotRefreshButtonClicked(){ doSomethings(); //Take a few seconds}问题是:我们只点击一次把槽函数运行100次,等它运行完再点击运行。如下。它并不会崩溃v原创 2022-05-19 11:43:02 · 2081 阅读 · 0 评论 -
qt随机生成差异大的颜色,并且避开红色
https://blog.youkuaiyun.com/ColdWindHA/article/details/82080176采用hsv色彩模型在HSV模型中,用度数来描述色相,其中红色对应0度,绿色对应120度,蓝色对应240度。在这里插入图片描述 //采用hsv色彩模型,h是色相 其中h落在[0,15] [295,360]是红色系。所以避开红色的h的取值范围在[15,295] //当两个颜色h值相差很大时,颜色看起来差别大 QList<QColor> ColorList; int Len原创 2022-05-18 13:44:54 · 2451 阅读 · 0 评论