![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
学习C++
光电的一只菜鸡
个人技术交流群833459254
展开
-
C++开发值得推荐的十大高效软件分析工具
C++开发值得推荐的十大高效软件分析工具原创 2024-07-23 15:46:48 · 97 阅读 · 0 评论 -
x64dbg调试器
x64dbg 是一款开源、免费、功能强大的动态反汇编调试器,它能够在Windows平台上进行应用程序的反汇编、调试和分析工作。与传统的调试器如Ollydbg相比,x64dbg调试器的出现填补了Ollydbg等传统调试器的不足,为反汇编调试工作提供了更高效、更可靠的解决方案。正是因为有了这些优点,才能使其成为当今最受欢迎的反汇编调试软件之一。原创 2024-06-25 21:50:33 · 947 阅读 · 0 评论 -
C++的并发世界(十)——线程异步和通信
promise用于异步传输变量std::promise提供存储异步通信的值,再通过其对象创建的std::future异步获得结构。std::promise只能使用一次。void set_value(_Ty &&Val)设置传递值,只能用掉一次。原创 2024-04-08 18:15:45 · 322 阅读 · 1 评论 -
C++的并发世界(九)——条件变量
单例设计模式是一种常见的设计模式,用于确保某个类只能创建一个实例。由于单例实例是全局唯一的。因此在多线程环境中使用单例模式时,需要考虑线程安全的问题。原创 2024-04-08 16:06:35 · 375 阅读 · 0 评论 -
C++的并发世界(八)——lock_guard和unique_lock
lock_guard是C++的stl库中的一种互斥量封装嘞,用于保护共享数据,防止多个线程同时访问同一资源而导致的数据竞争问题。lock()和unlock()操作等同于lock_guard的构造函数和析构函数。原创 2024-04-06 22:32:44 · 488 阅读 · 0 评论 -
C++的并发世界(七)——互斥锁
假设有两个线程T1和T2,它们需要对两个互斥量mtx1和mtx2进行访问。而且需要按照以下顺序获取互斥量的所有权:-T1先获取mte1的所有权,再获取mt2的所有权。-T2先获取 mtx2的所有权。再铁取 mtx1的所有权。如果两个线程同时执行,就会出现死锁问题。因为T1获取了mtx1的所有权,但是无法获取mtx2的所有权,而T2获取了mtx2的所有权,但是无法获取 mtx1的所有权,两个线程互相等待对方释放互斥量,导致死锁。原创 2024-04-06 19:22:34 · 693 阅读 · 0 评论 -
C++的并发世界(六)——互斥解决数据共享冲突
在多个线程中共享数据时。需要注意线程安全问题。如果多个线程同时访问同一个变量。并且其中至少有一个线程对该变量进行了写操作。那么就会出现数据竞争问题。数据竞争可能会导致程序崩溃,产生来定义的结果,或者得到错误的热果。为了避免数据竞争问题。需要使用同步机制来确保多个线程之间对共享数据的访同是安全的。常见的同步机制包括互厍量。条件变量,原子授作等。原创 2024-04-03 22:47:47 · 313 阅读 · 0 评论 -
C++的并发世界(五)——线程状态切换
初始化:该线程正在被创建;就绪:该线程在列表中就绪,等待CPU调度;运行:该线程正在运行;阻塞:该线程被阻塞挂机,Blocked状态包括:pend(通过锁、事件、信号量等阻塞)、suspend(主动pend),延时阻塞(delay)、pendtime(因为锁、事件、信号量时间等超时等待)退出:该线程运行结束,等待父线程收回器控制块资源。原创 2024-04-03 22:26:29 · 762 阅读 · 0 评论 -
左值引用和右值引用
可以直接赋值的原因是临时对象即将销毁,不会出现浅拷贝的问题,我们直接把临时对象持有的资源赋给新对象就可以了。带右值引用参数的拷贝构造和赋值重载函数,又叫移动构造函数和移动赋值函数,这里的移动指的是把临时量的资源移动给了当前对象,临时对象就不持有资源,为nullptr了,实际上没有进行任何的数据移动,没发生任何的内存开辟和数据拷贝。右值引用的存在并不是为了取代左值引用,而是充分利用右值(特别是临时对象)的构造来减少对象构造和析构操作以达到提高效率的目的。右值引用是指对右值的引用,可以将右值绑定到右值引用上。原创 2024-04-03 14:24:42 · 469 阅读 · 0 评论 -
C++的并发世界(四)——线程传参
在线程引用中需要使用ref函数引用参数。③传递的指针变量的生命周期小于线程。②多线程共享访问一块空间。原创 2024-04-02 23:43:00 · 355 阅读 · 0 评论 -
C++的并发世界(三)——线程对象生命周期
从执行结果来看,线程在std::thread th(ThreadMain)的时候就已经启动了,join只不过相当于堵塞等待的作用,原创 2024-04-02 22:43:58 · 356 阅读 · 0 评论 -
C++的并发世界(二)——初识多线程
①并发:指两个及以上的独立活动同时进行,即一个程序执行多个独立的任务,以往计算机,单核cpu某一个时刻只能执行一个任务。若要实现多任务,则需要通过操作系统采用时间片询方法进行多进程切换。多进程切换的方法属于伪并发,操作系统保存各个任务的各种状态、执行进度需要时间开销。随着硬件发展,出现了多处理器,能够实现真正的并行执行多个任务(硬件并发)②可执行程序(文件):非常好懂,略;linux为可IO操作的文件。③进程:正在执行的可执行程序。④线程:一个进程只能有一个主线程。原创 2024-04-02 21:38:54 · 781 阅读 · 0 评论 -
C++多态
1.多态的概念与分类多态(Polymorphisn)是面向对象程序设计(OOP)的一个重要特征。多态字面意思为多种状态。在面向对象语言中,一个接口,多种实现即为多态。C++ 中的多态性具体体现在编译和运行两个阶段。编译时多态是静态多态,在编译时就可以确定使用的接口。运行时多态是动态多态,具体引用的接口在运行时才能确定。静态多态和动态多态的区别其实只是在什么时候将函数实现和函数调用关联起来,是在编译时期还是运行时期,即函数地址是早绑定还是晚绑定的。静态多态是指在编译期间就可以确定函数的调用地址,并生产代码,转载 2022-06-23 13:20:12 · 201 阅读 · 0 评论 -
VS下release调试
https://blog.csdn.net/liuzhezhe111/article/details/82155306原创 2022-01-15 16:52:33 · 156 阅读 · 0 评论 -
.H和HPP
.hpp,本质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该.hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用project中的cpp文件数与编译次数,也不用再发布lib与dll文件,因此非常适合用来编写公用的开源库。hpp的优点不少,但是编写中有以下几点要注意:1、是Header Plus Plus的简写。(.h和.hpp就如同.c和.原创 2021-12-20 15:18:15 · 193 阅读 · 0 评论 -
Struct 和 Union区别
一、Struct 和 Union有下列区别:1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息。2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在。3.对于Union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于struct 的不同成员赋值 是互不影响的。注:在很多地方需要对结构体的成员变原创 2021-12-20 10:53:19 · 2821 阅读 · 0 评论 -
for循环中带冒号(:)用法简介
正常我们想要输出一个数组的全部元素时,需要采用以下的方法://随机定义的数组int array[10] = { 54, 23, 78, 9, 15, 18, 63, 33, 87, 66 };for (int i = 0; i < 10; i++) { cout << array[i] << " "; //输出:54 23 78 9 15 18 63 33 87 66}在C++11中,我们可以在for循环填加冒号 : 来简化这一过程://随机定义的数组in原创 2021-10-11 10:42:23 · 7247 阅读 · 0 评论 -
C++枚举类
众所周知在C++中,变量名字仅仅在一个作用域内生效,出了大括号作用域,那么变量名就不再生效了。但是传统C++的enum却特殊,只要有作用域包含这个枚举类型,那么在这个作用域内这个枚举的变量名就生效了。即枚举量的名字泄露到了包含这个枚举类型的作用域内。在这个作用域内就不能有其他实体取相同的名字。所以在C++98中这个称之为不限范围的枚举型别enum Color{black,white,red}; //black、white、red作用域和color作用域相同auto white = false; //错误原创 2021-10-10 20:35:06 · 1189 阅读 · 0 评论 -
C++设计模式(二)——适配器(Adapter)
0.参考资料《C++代码整洁之道》《GoF设计模式》《C++设计模式》1.间接接口 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。2.适配器任务 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。将一个类的接口转换成客户希望的另一个接口,使得那些原本不能一起工作的类实现兼容。3.用处Adapter模原创 2021-08-25 21:17:17 · 251 阅读 · 0 评论 -
C++设计模式(一)——单件模式(单例模式)
该模式的核心思想是保证一个类仅有一个实例,并提供一个该实例的全局访问点。class Singleton{ private: Singleton(); Singleton(const Singleton& other); public: static Singleton* getInstance(); static Singleton* m_instance;};Singleton* Singleton::m_instance=nullptr;//线程非安全版本原创 2021-08-15 22:11:19 · 256 阅读 · 0 评论 -
c++设计模式(零)——单例模式
所谓的设计模式,就是某类问题的特殊解决问题方案。1.单例模式 在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。有 3 个特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点。 其优点在于:单例模式可以保证内存里只有一个实例,减少了内存的开销;可以避免对资源的多重占用;单例模式设置全局原创 2021-08-15 21:22:01 · 242 阅读 · 1 评论 -
using和typedef区别
类型别名(type alias)是一个名字,它是某种类型的同义词。使用类型别名有很多好处,它让复杂的类型名字变得简单明了、易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的。在C++中,任何有效类型都可以有别名。有两种方法可用于定义类型别名:传统的方法是使用关键字typedef;C++11中规定了一种新的方法,使用别名声明(alias declaration)来定义类型的别名,即使用using.关键字typedef作为声明语句中的基本数据类型的一部分出现。含有typedef的声明语句定义的原创 2021-06-05 11:56:47 · 4506 阅读 · 0 评论 -
VS反汇编
1.基本操作在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息。如下图所示。记得中断程序的运行,不然看不到反汇编的指令2.汇编基本知识(1)程序实现函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果,还有大家比较熟悉的一句话,就是函数调用是在栈上发生的,那么在计算机内部到底是如何实现的呢?对于...原创 2019-10-16 18:04:35 · 880 阅读 · 0 评论 -
VS 2015 GIT操作使用说明
相比VS2013,VS2015在对GIT的支持上有了更强大的支持。本篇仅作抛砖引玉,不做过多介绍:1. 打开VS 2015起始页2. 打开团队资源管理器打开【本地GIT存储库】选项卡,然后点击【克隆】按钮。3. 获取GIT存储库URL比如:4. 从远程存储库克隆到本地,并等待克隆完成直到成功:5. 打开解决方案双击存储库名称,打开主页...转载 2019-04-20 13:52:18 · 1288 阅读 · 0 评论 -
VS工程文件后缀的意义
.DSP:VC开发环境生成的工程文件,VC4及以前版本使用MAK文件来定义工程。.DSW:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。.NCB:NCB是“No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。.OPT:VC开发环境自动生...原创 2019-04-20 09:27:29 · 1496 阅读 · 0 评论 -
C++升级之整洁之道(七)——驱动测试(TDD)
1.单元测试的缺点 (1)一旦一个功能工作,用单元测试改进代码的动机很少;(2)结果代码很难测试;(3)通过改进的单元测试达到较高的测试覆盖率并不容易,完成代码后编程单元测试可能会导致漏掉某些问题或者bug。2.驱动测试的流程 组件、类以及函数从业务类基础的需求,TDD及其测试的第一种方法是通过单元测试确定需求——实际上,在编写代码之前,在测试第一种开发组件的方法中,这里指的是最底层的需求。 其次,我们将编写一个测试,从而设计公共接口。这可能让人惊讶,因为在这个周期的一次允许中我们仍然没有编写原创 2021-05-22 14:48:35 · 1169 阅读 · 10 评论 -
C++升级之整洁之道(六)——函数式编程
函数式编程也是一种编程范式,其定义通常归因于它的积极属性,包括:1.通过避免(全局)共享科不的状态消除了副作用,在纯函数式编程中,函数调用没有任何副作用。2.不可变的数据和对象。在纯函数编程中,所有数据都是不可变的,数据结构一旦创建,它就永远不会被改变,不可变数据具有线程安全的巨大优势。3.在函数式编程中,可以像对待数据一样对待函数,可以将函数存在在变量中,也可以将函数做评委参数传递给其他函数,还可以将函数作为其他函数的返回结果,函数可以很容易地链接。4.更好更容易的并行化,需要锁和同步机制来保护数据不原创 2021-05-22 13:58:43 · 562 阅读 · 2 评论 -
C++升级之整洁之道(五)——类的设计原则
类被视为封装的软件模块,它们将结构特征(数据成员)和行为特征(成员函数)组合成一个有聚合力的单元。1.让类尽可能小 大类的问题是显而易见的,很难拿被剂嘞,并且可维护性和可测试性很差,更不要说可复用性了。小类更容易使用、理解和测试,每个软件系统都可以分解成小的基本块。2.单一职责(SRP)原则 每个软件单元,组件、类和函数,应该只有一个单一且明确定义的职责。如果系统不同方面的新需求或需求变得而需要更改类时违背了该原则,则可以改变该类。遵循SRP的类通常很小并且具有很少的依赖性。3.开闭原则原创 2021-05-21 17:30:10 · 219 阅读 · 0 评论 -
C++容器
C++ STL中容器的使用全面总结_算法改变人生-CSDN博客_c++ stl容器原创 2021-05-07 16:36:24 · 117 阅读 · 0 评论 -
C++升级之整洁之道(四)——相关技巧
1.智能指针 资源申请即初始化是帮助我们安全处理资源的术语,也被称为“构造时获得,析构时释放”。 std::unique_ptr< T >是具有独占所有权的,即一个对象一次智能由std::unique_ptr< T >的一个实例拥有。std::shared_ptr< T >是共享所有权的,可以指向T类型的一个对象,也可以与std::shared_ptr< T >的其他实例共享这个所有权。std::shared_ptr< T >是可以拷贝的,原创 2021-05-07 16:26:43 · 129 阅读 · 0 评论 -
C++泛型编程
有了一些使用STL的经验后,来看一看底层理念。STL是一种泛型编程( generic programming)。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是抽象和创建可重用代码,但它们的理念绝然不同。泛型编程旨在编写独立于数据类型的代码。在C++中,完成通用程序的工具是模板。当然,模板使得能够按泛型定义函数或类,而STL通过通用算法更进了一步。模板让这一切成为可能,但必须对元素进行仔细地设计。为解模板和设计是如何协同工作的,来看一看需要迭代器的原因。理解迭代器是理解ST原创 2021-04-07 13:12:57 · 264 阅读 · 0 评论 -
C++智能指针
1.智能指针的由来先看下面代码:void remodel(std::string &str){ std::string *ps = new std::string(str); if(werid_thing()) { throw exception(); } str =*ps; delete ps; return;}当remodel( )这样的函数终止(不管是正常终止,还是由于出现了异常而终止),本原创 2021-04-06 22:10:33 · 123 阅读 · 0 评论 -
编译库的方法(基于MSYS2与MinGW-w64)(一)——如何根据configure.ac和Makefile.am为开源代码产生当前平台的Makefile
1.参考链接如何根据configure.ac和Makefile.am为开源代码产生当前平台的Makefilehttps://www.cnblogs.com/lidabo/p/7269077.htmlWindows下搭建类UNIX环境 : Msys2+MinGW-w64https://blog.csdn.net/yehuohan/article/details/520902822.引...原创 2019-08-20 11:42:48 · 818 阅读 · 0 评论 -
编译库的方法(基于MSYS2与MinGW-w64)(零)——安装MSYS2与MinGW-w64
1.下载MSYS2与MinGW-w64我一起打包发上来,我传到QQ群里,群号为:8656879582.安装SYS2(1)安装exe文件(2)修改镜像 <1>镜像目录位\etc\pacman.d,有三个文件,我用notepad++打开后,如下图<2>对mingw32,修改后的内容如下#### 32-bit Mingw-w64 reposi...原创 2019-08-20 09:41:10 · 2164 阅读 · 0 评论 -
C#DLL托管c++ (CLI) String^ 到 std::string 的相互转化
C#DLL托管c++ (CLI) String^ 到 std::string 的相互转化:https://blog.csdn.net/spiritring/article/details/24978365?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-ta...原创 2020-02-25 17:19:59 · 567 阅读 · 0 评论 -
重新学习C#(二)——ref方法
0.参考链接c#---ref参数https://www.cnblogs.com/huangxuQaQ/p/10729367.html浅析ref、out参数https://www.cnblogs.com/vd630/p/4601919.html1.参考代码ref参数:将变量带入一个方法中改变之后在带出方法,ref参数在方法外也就是调用方法之前必须为其赋值static voi...原创 2020-02-20 11:46:12 · 495 阅读 · 0 评论 -
重新学习C#(一)——基本语法
0.程序结构1.基本语法默认大家都有C/C++的基础,这里就不普及C/C++里面的语法了,主要是补充一些罕见的用法。2.@关键字其作用主要包括有:1.忽略转义字符2.让字符串跨行 3.在标识符中的用法,C#是不允许关键字作为标识符(类名、变量名、方法名、命名空间等使用的),但如果加上@之后就可以作为变量名3.数据类型数据类型是表示具有多种相同特征的一组数据。C#预定...原创 2020-02-19 20:59:05 · 274 阅读 · 0 评论 -
重新学习C#(零)——第一个程序
好吧,之前学C#不够认真,现在重开一个专题学习C#。0..net与C#一般指.Net Framework框 架,是Microsoft为开发应用程序而创建的一个具有革命意义的平台,最新的版本为4.5。.net(dotnet)内容:①主要包含一个庞大的代码库,可以在客户语言(如C#)中通过面向对象编程技术(OPP)来使用这些代码。这个库分为多个不同的模块,这样就可以根据希望得到的结果来选择...原创 2020-02-19 11:36:36 · 239 阅读 · 0 评论 -
学习C#(六)——类和方法
0.参考链接类的定义:http://c.biancheng.net/view/2806.htmlC#访问修饰符、修饰符:http://c.biancheng.net/view/2807.htmlC#方法的定义:http://c.biancheng.net/view/2808.htmlC#面向对象简介:http://c.biancheng.net/view/2805.html1....原创 2019-12-12 11:27:39 · 653 阅读 · 0 评论 -
学习C#(五)——基本语法(关键字)
1.if-elseif else 语句是最常用的条件语句,并且 if else 语句的形式有多种,包括单一条件的 if 语句、二选一条件的 if else 语句以及多选一条件的 if else if 语句。下面将详细介绍这 3 种形式。单一条件的 if 语句是最简单的 if 语句,只有满足 if 语句中的条件才能执行相应的语句。具体的语法形式如下。if(布尔表达式){ 语句块...原创 2019-12-12 10:55:55 · 255 阅读 · 0 评论