自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 如何用vs studio调试qt程序,和动态库程序

软件对外发布的时候时release的,但是我们需要对应发布版本时的代码,作为出现问题时调试用。所以在发布的时候生成对应的pdb。安装qt时安装 msvc2019 的编译器,qt creator构建工程时也要用msvc的编译器,为了调试方便。2.程序启动后就加载了my_log动态库,点击调试 -> 附件到进程。刚才的例子中 住程序gui暂时没有配置生成pdb,my_log生成了pdb了。1.选择要留存pdb文件的模块,如my_log。这时候再右键生成的时候,在指定的路径下就会生成pdb文件了。

2024-05-19 11:59:56 294

原创 c++程序员通用成长规划

要有一个长期的学习计划,确定学习方向,拆分为各个模块,每天学习多少,根据实际情况灵活调整,一切以当前实际工作为主后续发展为辅,并且要坚持。这里的坚持不是强制的,比如今天有事学习计划不能执行或今天就是懒了不想学了就放弃长期学习的规划。哪怕中间断了一个月或者几个月,再想起学时都不要摆烂觉得自己都断了这么长时间了怀疑自己不是个有毅力的人而直接放弃学习。种一颗树的最佳时机是十年前,其次是现在。这句话任何时候想起都为时不晚。学习的东西要懂得梳理分类记录到自己的笔记中,看到好文章可以直接复制或者记录下网址。

2024-04-17 15:07:02 776 1

原创 那些年踩过的坑

使用自定义比较函数时 手欠,元素对比 写了 return a <= b;结果数组越界,程序崩溃。sort内部算法优化,必须保证比较函数保证弱序。

2023-06-08 11:13:03 103

原创 std::unique_lock 和 std::lock_guard

是 C++ 标准库中用于管理互斥锁的类模板,它们都提供了简化多线程编程中互斥访问的机制,但在功能和灵活性方面存在一些区别。是一个更灵活和功能更强大的互斥锁管理类。它提供了更多的操作,如延迟加锁、手动释放锁、尝试加锁和超时加锁等。对象一旦被创建,就会锁定互斥锁,一旦对象离开作用域,就会自动释放互斥锁,确保在任何情况下都不会忘记释放锁。是一个轻量级的互斥锁管理类,它通过构造函数获取锁,析构函数释放锁。具有更大的开销,因为它需要使用动态分配的资源来管理锁的状态。更适合简单的锁定范围,并且不能显式地释放锁。

2023-05-24 20:52:41 987

原创 函数 prctl 系统调用

是一个系统调用,用于控制和修改进程的行为和属性。它可以在Linux系统上使用,提供了各种功能和选项来管理进程的不同方面。每个选项都有特定的参数,可以根据需要传递。具体的参数和行为取决于所选的选项。函数将当前进程的名称设置为"MyProcess"。函数时,应该查阅相关文档并了解所使用的操作系统的支持和限制。函数的具体行为和可用选项可能因操作系统和版本而异。选项和参数,用于执行不同的操作。函数获取进程的名称,并将其打印到标准输出。以下是一个简单的示例,展示了如何使用。这些仅是一些常用的选项,

2023-05-23 10:15:17 2817

原创 【与代码编译相关的东西】

该选项告诉编译器将所有未显式声明为可见的符号(如函数和变量)标记为“隐藏”(hidden),以使它们对链接器不可见。这样,可以避免在链接时将未使用的符号链接到可执行文件中,从而减小可执行文件的大小。这样,在链接时可以更容易地剔除未使用的变量,从而减小可执行文件的大小。这样,当链接器(ld)进行链接时,可以更容易地剔除未使用的函数代码,从而减小可执行文件的大小。需要注意的是,使用这些选项可能会对代码的可读性和调试性产生一定的影响,因为代码被拆分成多个小段,导致可读性和调试时的代码映射变得更加复杂。

2023-05-16 11:13:53 114

原创 【lambda表达式传值问题研究】

lambda表达式引用传值

2023-05-04 20:46:37 582

原创 git冲突解决(命令行)大全CTMD

冲突前言场景一、拉取远端分支代码时产生冲突解决方案场景二 、与远程分支都修改了同一个文件解决方案前言工作两年多了,用git总会发生冲突。因为是嵌入式入的行一直在ubuntun里写代码 ,提交代码习惯了命令行敲命令。小乌龟软件据说很好用,后期学学。项目开发总遇到冲突,之前都是把自己的新写的代码拷出来。然后把修改的文件撤销,git pull拉代码。再把新代码写回去。为啥用这么土的方法呢?因为自己出身培训班,git、svn都是参加工作的时候接触的。面试的时候装杯说自己会用。遇到冲突了百度一下解决方法,也没 解

2022-03-11 11:54:20 4618

原创 git常用的一些功能

工作中git操作

2021-12-22 17:26:44 538

原创 c++外观模式

外观模式简介UML优点缺点代码参考简介在MVP架构的软件分层框架下常见。对应界面来讲我点击一个按钮不需要知道底层完成这个业务的步骤细节。只需要P层提供一个接口用于调用即可。在分层软件框架下外观模式常被使用在层与层之间。UML优点(1) 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。(2) 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类

2021-12-22 15:09:00 748

原创 std::vector的原理之一begin()和end()

@TOC前言同事遇见个bug,在一个容器中使用std::find寻找指定元素,找到后将一个标志位置位。但是log数据找到了指定元素,但实际容器中却不含有此元素。伪代码void findElement(const vector<int>& vec, int key){ auto it = find(vec.begin(), vec.end(), key); if (it != vec.end()) { // setFlag(true);

2021-12-22 11:13:31 1704

原创 explicit 与变量初始化时的隐式转换

explicit 与隐式转换隐式转换代码说事explicit隐式转换类变量刚被定义时使用 = 一个非同类的其它类型变量;其实是调用对应的构造函数。进行初始化,这一过程是编译器识别的。 = 一个同类的变量则是调拷贝构造(此篇文章不讲)代码说事#include <iostream>using namespace std;class Test{public: Test() { cout << "Test()" << endl;

2021-12-14 16:58:07 888

原创 c++组合模式

c++组合模式简介UML优点缺点使用场景代码简介将对象组合成树形结构以表示"部分-整体"的层次关.组合模式使得用户对单个对象和组合对象的使用具有一致性.UML优点高层模块调用简单;高度自由缺点叶子和树枝的声明都是实现类,违反了依赖倒置原则.使用场景1.你想表示对象的部分-整体层次结构。2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。代码代码已公司架构为例。阿里总公司旗下北京分公司旗下高德地图,杭州总部旗下得支付宝,淘宝 等。...

2021-10-27 21:12:05 290

原创 c++桥接模式

c++桥接模式简介UML优点缺点代码简介这是这些设计模式里,理解上最费劲的模式了。将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化。以前我们实现一个接口直接使用继承 就好了。桥接模式则是把继承关系转化成了 组合关系。实现 了 抽象 与 实现 分离。UML优点1.将实现抽离出来,再实现抽象,使得对象的具体实现依赖于抽象,满足了依赖倒转原则。2.将可以共享的变化部分,抽离出来,减少了代码的重复信息。3.对象的具体实现可以更加灵活,可以满足

2021-10-25 21:29:25 435 1

原创 c++适配器模式

c++适配器模式简介UML优点缺点代码简介将一个类的接口转换成客户希望的另外一个接口UML优点可以将不符合要求的接口转换为需要的接口。缺点多了个适配器类出来代码能用组合实现的一般不推荐使用继承,所以代码中类模式轻易不要用#include <iostream>using namespace std;class ITarget{public: virtual void request() = 0;};class Adaptee{public:

2021-10-24 21:07:54 221

原创 C++装饰者模式

C++装饰者模式简介UML优点缺点代码理解简介时常会遇到这样一种情况,我已经设计好了一个接口,并且也有几个实现类,但是这时我发现我设计的时候疏忽了,忘记了一些功能,或者后来需求变动要求加入一些功能,最简单的做法就是修改接口,添加函数,然后继承类中都相应的添加实现,这样做倒也没什么问题,但是如果这种变化来个好几次或者继承类非常多,那工作量可就大了。这时大神们就发明了装饰者模式,在不修改现在有接口和实现类的基础上实现功能或者状态的添加。UML优点1.可以不用修改原有的接口,就可以实现新功能的添加。

2021-10-24 20:30:00 2110

原创 c++11新特性遇见一个记一个

c++11新特性遇见一个记一个std::functionstd::movestd::functionstd::function是函数模板类(是一个类);std::bind是函数模板(是一个函数);#include <memory>#include <iostream>#include <functional>using namespace std;void hello(){ cout << "hello" << endl;

2021-10-19 20:13:31 434

原创 c++代理模式

c++代理模式简介UML优点缺点使用场景代码参考简介代理模式也称为委托模式。作用就是找一个对象来替我们访问某个对象。意图:为其他对象提供一种代理以控制对这个对象的访问。UML1.Subject:定义RealSubject和Proxy的共用接口,这样就可以在任何使用RealSubject的地方都可以使用Proxy。2.RealSubject:真实处理业务的角色。3.Proxy:保存一个引用使得代理可以访问实体。优点职责清晰:真实角色就是实现实际的业务逻辑,不关心其他非本职责的事务,通过后期

2021-10-19 15:59:00 175

原创 c++建造者模式

c++建造者模式简介优点缺点使用场景代码实例参考文章简介建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这是建造者模式的标准表达,不过看着让人迷惑,什么叫构建和表示的分离?一个对象使用构造函数构造之后不就固定了,只有通过它方法来改变它的属性吗?而且还要同样的构建过程搞出不同的表示,怎么可能呢?多写几个构造函数?其实多写几个构造函数,根据不同参数设置对象不同的属性,也可以达到这样的效果,只是这样就非常麻烦了,每次要增加一种表示就要添加一个构造函数,将来构造函数会多得

2021-10-18 17:32:16 169

原创 c++单例模式

c++单例模式简介代码参考简介因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。它有很多种实现方式,各自的特性不相同,使用的情形也不相同。今天要实现的是常用的三种,分别是饿汉式、懒汉式和多线程式。通过单例模式, 可以做到:确保一个类只有一个实例被建立提供了一个对对象的全局访问指针在不影响单例类的客户端的情况下允许将来有多个实例具体细节见:单例要注意的地方代码参考原文链接:ht

2021-10-14 17:20:05 54

原创 c++原型模式

c++原型模式简介特点缺陷代码使用场景简介UMl特点可以在程序运行时(对象属性发生了变化),得到一份内容相同的实例,但之间还不会相互干扰。缺陷使用场景跟拷贝构造相似度很高,能用拷贝构造(注意考虑深浅拷贝)解决不用非得搞设计模式。注意但是使用了原型模式就是不想暴露给用户对象创建过程。只能通过clone来获取对象的拷贝。和工厂模式可以搭配,隐藏对象的创建细节。代码#include <string>#include <iostream>using namespa

2021-10-13 20:26:23 192

原创 c++工厂模式总结

工厂模式工厂模式种类单工厂模式特点缺陷工厂方法模式![在这里插入图片描述](https://img-blog.csdnimg.cn/33a3ca39b69b4b329d641987f2d39118.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA56iL5bqP5ZGY6ICB5ZCV,size_20,color_FFFFFF,t_70,g_se,x_16)特点缺陷抽象工厂模式![在这

2021-10-12 14:56:49 112

原创 linux下C++调C库,C调C++库

linux下C++调C库,C调C++库C++调C库编译C 调用C++ 库C++调C库main.cpp#include "fun.h"int main(){ fun();}fun.hvoid fun();fun.c#include <stdio.h>#include "fun.h"void fun(){ printf("hello world!\n");}编译1.直接g++编译cpp 和 c文件2.将c文件做成动态库然后动态链接为何

2021-09-30 14:56:24 512

原创 linux信号

linux信号信号简述信号类型:信号的生命周期信号注册信号安装参考文章(ctrl C V 出处):信号简述信号是进程间通信机制中唯一的异步通信机制, 是在软件层次(包括操作系统)上对中断机制的一种模拟 .信号类型:SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILLSIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPESIGKILL 10) SIGUSR1 11) S

2021-09-24 18:02:10 104

原创 Linux下使用backtrace开发崩溃日志输出库

1.通过虚拟地址结算地址偏移。接到崩溃信号后,打印处程序的 map数据。然后用崩溃处的函数地址 - 起始地址 = 偏移地址。2.通过 函数名 + 偏移的方式计算函数明后边会有个 + 0x666. 所以 函数的相对地址 + 函数内的偏移位置 = 问题发生的偏移地址。获取相对地址:ELF格式里。Section区域有个. text 区域,此区域包含了程序可执行的指令。使用 objdump 可将指令进行反汇编。其中就包含了偏移地址。objdump -S XXX.so | grep “函数名” 会得

2021-09-18 16:42:17 1003

转载 syscall(SyS_gettid)

在linux下每一个进程都一个进程id,类型pid_t,可以由getpid()获取。POSIX线程也有线程id,类型pthread_t,可以由pthread_self()获取,线程id由线程库维护。但是各个进程独立,所以会有不同进程中线程号相同节的情况。那么这样就会存在一个问题,我的进程p1中的线程pt1要与进程p2中的线程pt2通信怎么办,进程id不可以,线程id又可能重复,所以这里会有一个真实的线程id唯一标识,tid。glibc没有实现gettid的函数,所以我们可以通过linux下的系统调用sysc

2021-09-17 16:11:45 359

原创 linux信号

linux信号各种信号kill 与 kill -9各种信号1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM

2021-09-17 14:48:59 1259

原创 c++库函数小笔记

c++库函数小笔记make_sharedmake_shared头文件: <memory>分配并构造一个T类型的对象,将args传递给其构造函数,并返回一个shared_ptr <T>类型的对象,该对象拥有并存储指向它的指针(使用计数为1)。此函数使用::new为对象分配存储空间。一个类似的函数allocate_shared接受一个分配器作为参数并使用它来分配存储。...

2021-09-16 19:06:27 50

原创 C语言库函数小笔记

C语言库函数小笔记readlinkaccessreadlink定义函数:int readlink(const char * path, char * buf, size_t bufsiz);函数说明:readlink()会将参数path 的符号连接内容存到参数buf 所指的内存空间, 返回的内容不是以NULL作字符串结尾, 但会将字符串的字符数返回. 若参数bufsiz 小于符号连接的内容长度, 过长的内容会被截断.返回值:执行成功则传符号连接所指的文件路径字符串, 失败则返回-1, 错误代码存

2021-09-16 16:40:59 94

原创 const 与 函数,C++篇

示例先把const 拉满,在聊const在各个位置的作用const int A::fun(const B& obj) const;const 在函数返回值前主要为了约束指针,使用场景一般是不想让使用者修改指针的值。比如: 某个单例对象有一个自己的唯一ID,对象创建后我们不希望它被改变。对外暴露get接口是,返回指针比创建一个字符串返回字符串进行拷贝构造效率要高,使用者那到指针读指针指向的值即可达到目的。示例代码#include <iostream>using name

2021-08-27 14:06:07 53

原创 vector容器resize和reserve探究

vector容器resize和reserve探究一级目录二级目录三级目录一级目录二级目录三级目录

2021-08-25 16:49:58 261

原创 调库的时候单例出了问题

起因发现这个问题是在我自己开发的软件 “北漂” ,时候遇到的。当时有有一个天气预报的模块,我为了练习动态库,把那个模块写成了动态库。发布程序时天气功能总是不好用。在网上搜解决方案时发现了这个问题,但是我自己程序处的问题其实不是因为这个,但我觉得着属于意外收获就记了下来。但是我windows上QT5.12.4这写问题没有复现。有可能新的编译器自己弥补了这个缺陷。但是以后工作的环境要是编译器版本老还有可能遇到。示例一个简单的Singleton类我们先来看一个简单的单件类的定义:#include&l

2021-01-06 15:31:08 115

原创 C语言静态函数不能被其他文件调用

起因做个C小实验,向判断一个动态库对外暴露的接口函数能否同时被两个程序调用,实验结果是可以的。然后试一下把那个接口函数写成静态函数再次尝试,编译出现报错。答案C语言中的static函数:内部函数和外部函数函数一旦定义后就可被其它函数调用。但当一个源程序由多个源文件组成时,在一个源文件中定义的函数能否被其它源文件中的函数调用呢。为此,C语言又把函数分为两类:一、内部函数如果在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用, 这种函数称为内部函数。定义

2021-01-05 18:21:39 3997

原创 UML图总结

立巨人之肩,可省登高之力参考资料:简介泛化关系实现关系耦合度:弱>>强依赖关系关联关系聚合关系组合关系参考资料:https://blog.csdn.net/strongman028/article/details/107352961简介UML类图,主要用于软件设计中反应类与类之间的关系,它也是学习设计模式之前必须熟悉的内容。类之间存在以下关系:泛化关系实现关系依赖关系关联关系聚合关系组合关系泛化关系泛化和实现都是类之间继承,泛化来说一般不重写父类的函数。只是功能拓展.

2021-01-03 09:21:29 135

原创 从内核调度算法的层面进行线程设计

按需求设计特殊线程线程是如何运行的什么决定线程的运行的顺序实时进程SCHED_FIFO:SCHED_RR:普通进程CFS:小结代码展示线程在线程中更改调度算法线程是如何运行的线程是内核调度的最小单元,每一个线程创建都会在内核实例出一个thread_info结构体,结构体中有一个task_struct结构体。这两个结构体描述着线程的信息。当中断触发调度时,schedule函数开始在几种不同类型的线程之间进行调度选择,在相同类型的线程之间进行调度算法选择。task_struct中描述着线程的类型,和调度方法

2020-12-25 16:55:06 118 2

原创 进程调度与调度器及算法

学无止境调度器详细解释内核V2.6.23之前调度算法内核V2.6.23之后CFS调度算法在内核 V2.6.23 后linux也能抢占进程的优先级调度器详细解释https://www.ibm.com/developerworks/cn/linux/l-cn-scheduler/index.html内核V2.6.23之前调度算法linux内核的三种 调度策略 :SCHED_OTHER 分时调度策略,(默认的)SCHED_FIFO实时调度策略,先到先服务SCHED_RR实时调度策略,时间片轮转

2020-12-23 18:46:24 459

原创 std::string工作中常用功能函数整理

立巨人之肩,可省登高之力string类的字符操作string的特性描述string的赋值string的连接string的比较string类的查找函数string类的替换函数string类的插入函数string类的删除函数string类的迭代器处理字符串流处理标准C++库字符串类std::string的用法参考文章参考原文的链接地址最后奉上,本想直接收藏前辈的文章。但恐某日原主自费武功删除博文。遂整理至己string类的字符操作const char &operator[](int n)const

2020-12-23 10:30:44 342

原创 std::this_thread::sleep_for和std::this_thread::yield还有sleep的区别与使用。

学无止境环境std::this_thread::sleep_for和sleepstd::this_thread::yield不加std::this_thread::yield()加std::this_thread::yield()总结环境本文无特殊说明均指linux环境std::this_thread::sleep_for和sleep这哥俩没啥太大区别都是表示当前线程休眠一段时间,休眠期间不与其他线程竞争CPU,根据函数参数,等待相应时间时间。只是一个是C的函数一个是c++的函数分别对应头文件 &l

2020-12-21 20:45:26 1777

原创 进程的执行状态与线程时间片的分配

学无止境环境线程的时间片分配线程的执行进程的状态三个状态状态的迁移环境无特殊指明,本文基于linux线程的时间片分配对linux系统来说,用户创建进程后,CPU分配时间片的单位其实是按线程分的。假如你的程序里没有创建线程,你可以把它看成是一个单线程程序,Linux内核其实不区分进程和线程,内核把执行单元叫做任务(task)。线程则是最小的工作单元。对于有子进程的程序来说,当该进程刚被其父进程fork出来时,是平分其父进程的剩余时间片的。这个时间片执行完后,就会根据它的初始优先级来重新分配时间片l

2020-12-21 20:42:52 5492

原创 c++临时线程的技巧与detach函数的应用

分析c++的临时线程应用场景举例C++线程类闪亮登场思路见代码代码分析避坑c++线程类小小总结c++的临时线程所谓的临时线程指的是,本身此线程不在项目的设计框架之内,就是满足异步执行一个临时任务,而不拖延主时序的进行而生。应用场景举例UI层点击按钮刷新歌曲列表,肯定是将UI的点击事件绑定到底层的搜索函数find()(随意起的名字),如果在find中等待程序搜索完成再向上返给UI层。那么程序会卡住find函数中等待事件处理结束。这时候我们一般都会采取异步设计。比如,通过find()触发线程来执行搜索歌

2020-12-18 11:34:04 726

C++代码编写规范sdfdsfdsafsa

C++代码编写规范sdfdsfdsafsa

2023-06-29

C++代码编写规范66666666666

C++代码编写规范66666666666

2023-06-21

C++代码编写规范6666

C++代码编写规范6666

2023-06-16

C++代码编写规范发发发否

C++代码编写规范发发发否

2023-06-16

空空如也

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

TA关注的人

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