自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++新特性--函数对象包装器 function

C++11 std::function 是一种通用、多态的函数封装,它的实例可以对任何可以调用的目标实体进行存储、复制和调用操作,它也是对 C++中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的),换句话说,就是函数的容器。当我们有了函数的容器之后便能够更加方便的将函数、函数指针,lambda表达式作为对象进行处理。...

2022-06-24 13:26:07 446

原创 C++新特性篇 - Lambada表达式

捕获列表比较特殊,所谓捕获列表,其实可以理解为参数的一种类型,Lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。有如下几种......

2022-06-24 13:11:32 738

原创 C++ 内存对齐详解加配图分析

C++内存对齐因为cpu在存取指令的时候,以字节长为单位进行存取,32位机器默认字节长4字节,64位机器默认长8字节。cpu每次读取都从对齐字节的整数倍开始读取,而存放数据cpu以对齐字节的整数倍进行存放,这要求我们对struct或class内的数据排布提出了要求。看这样一段代码struct A的大小占比为12字节而struct B的大小占10字节而struct C的大小占8字节?(为啥一个char c需要8字节?==》因为内存对齐是按成员变量中sizeof最大值作为对齐条件)内存对齐规律一般来说,

2022-06-09 18:03:53 438

原创 《Effective C++》全局概述篇

C++可以视为由相关次语言组成的联邦,每个次语言都有自己的规约。大致分为四个:C:C++仍然是以C为基础。区块,语句,预处理,内置数据类型,数组,指针都是来自CObject-Oriented C++:面向对象设计。封装,继承,多态,虚函数,析构构造。Template C++:泛型编程。templates威力强大,可以带来崭新的编程范型。STL:标准模板程序库。他对容器,迭代器,算法以及函数对象的规约有极佳的紧密配合与协调。#define用于常量的场景缺点:a. #define定义的常量导致编译出错

2022-06-04 22:56:17 1219

原创 《Effective C++》总结篇(实现)

大多数情况下,适当提出你的classes(和class template)定义以及functions(和function templates)声明,是花费最多心力的两件事。一旦正确完成它们,相应的实现大多直接了当。尽管如此,还是需要注意某些东西:看这一段代码,我们调用CreateStr函数。返回一个res但是,如果temp的长度太小的话,就会因为异常导致res后续不处理。相当于res无端的进行了构造和析构,但是没有被使用,这非常浪费所以我们尽可能要在我们需要使用的时候再用它。即改成:你应该尝试延后

2022-06-04 22:13:31 452

原创 《Effective C++》 总结篇(杂项讨论)

《Effective C++》 总结篇(杂项讨论)

2022-06-04 21:10:55 236

原创 《Effective C++》 总结篇(定制new和delete)

本章主要唠嗑一下new和delete。当operator new抛出异常以反应未获满足的内存需求之前会先调用new-handle。客户可以指定这个“用以处理内存不足”的函数,客户必须调用set_new_handler。(在标准库)本例代码就是不断生成内存直到用尽,而抛出异常。为了防止当operator无法满足内存申请时反复调用new-handler函数,我们需要做以下事情:1.让更多内存被使用。(调用new-handler之后将资源释放)2.安装另一个new-hander。(当前的new-hander

2022-06-03 18:46:50 370

原创 《Effective C++》 总结篇(模板与泛型编程)

条款四十一:了解隐式接口的和编译期多态和面向对象编程的显示接口和运行期多态不同,泛型编程更多是隐式接口和编译期多态。#include <iostream>using namespace std;class A{public: A() { x = 12; cout << "Create A" << endl; } virtual std::size_t size() const { return x; } virtual void Init() { x

2022-05-30 22:42:42 438

原创 《Effective C++》总结篇(继承与面向对象设计)

条款三十二:确定你的public继承塑模出is-a关系如果你令class D(“Derived”)以public形式继承class B(“Base”),你便是告诉C++编译器(以及你的代码读者)说,每一个类型为D的对象同时也是一个类型为B的对象,反之不成立。你的意识是B比D表现出更一般化的概念,而D比B表现出更特殊化的概念。你主张“B对象可派上用场的任何地方,D对象一样可以派上用场”,因为每一个D对象都是一种B对象。反之如果你需要一个D对象,B对象无法效劳,虽然每个D对象都是一个B对象,反之并不成立。每

2022-05-28 19:46:50 257

原创 词源学习法第二集---alarm

本期单词alarm让我们从词源和应用分两步走记住这个单词吧!gogogo1.从词源出发词源学网站定义核心看这里:alarm=alarmme=alle arme.=(al)+(arm)=(Alle)+(arme)=(ad- + le)+(arme)=(to the)+ (weapons)=去武装(当危险到来的时候发出集体武装的号令!)ad-表示朝向或附加方向的构词成分,表示在空间或者时间上的“to,toward”有时仅强调语气“with regard to, in relation to

2022-05-27 14:13:18 1048

原创 词源学习法第一集---election

本期单词election让我们从词源和应用分两步走记住这个单词吧!gogogo1.从词源出发词源学网站定义好的,以上这些都不重要。重要的是拉丁语这块,拉丁语electionem意思是挑选,选出(-ionem,表状态或结果)而electionem源自于eligere的过去分词词干(盲猜是electio)而eligere = ex- + -ligere = ex- + leg-=out+choose=向外+选择那么我们看看这两个词根ex/legex-通常指“out of,from”,但

2022-05-26 19:24:40 825

原创 《Effective C++》总结篇(设计与声明)

条款十八:让接口容易被使用,不易被误用1.我们应该预防“接口被误用”。假设有这么一个构造函数#include <iostream>using namespace std;class Data{public: Data(int month, int day, int year) {}};int main(){ Data d1(30, 3, 1995);//正确 Data d2(1995, 30, 3);//无效的年月日! return 0;}为了防止他们被误用,所

2022-05-20 21:20:53 365

原创 《Effective C++》总结篇(资源管理)

所谓资源就是你用了它就一定要还回去,不然会产生很多问题。全篇围绕着RAII(Resource Acquisition Is Initialiaztion)模式结合智能指针进行讲述如何管理资源条款十三:以对象管理资源我们创建了对象之后,很可能会忘记delete它,或者因为某些原因无法delete它,最后导致内存泄漏。为了确保资源总是会被释放的,我们需要将对象资源放进对象内,当控制流离开,对象的析构函数会自动释放掉这些资源。故依赖C++的析构函数自动调用机制,确保资源被释放。智能指针auto_ptr正

2022-05-16 20:23:14 358

原创 《Effective C++》总结篇)构造/析构/赋值运算

条款五:了解C++默默编写并调用哪些函数如果你自己没声明,编译器就会为它声明一个copy构造函数,一个copy assignment操作符,一个析构函数和一个default构造函数,并且都是public和inline的#include <iostream>using namespace std;class A{};int main(){ A a; //构造函数 A a1(a);//copy 构造函数 a1 = a;//copy assignment函数

2022-05-15 17:09:17 372

原创 《Effective C++》总结篇(让自己习惯C++)

条款一:视C++为一个语言联邦条款二:尽量以const,enum,inline替换#define条款三:尽可能使用const条款四:确定对象被使用前已先被初始化

2022-05-14 18:15:35 418

原创 C++ 指针和引用的区别

★相同点:●都是地址的概念;●指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。★不同点:●指针是一个实体,而引用仅是个别名;●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可

2022-05-08 20:50:10 145

原创 重写和重载的区别

重写:overrider 重写也就是我们通常所说的覆盖,重写是指在派生类当中,重新对基类中的虚函数度重新实现。重载:重载指的是不用的函数使用相同的函数名字,可是,函数的参数、个数或者是类型都不同。定义不同—重载是定义相同的方法名,参数不同;重写是子类重写父类的方法范围不同—重载是在一个类中,重写是子类与父类之间的多态不同—重载是编译时的多态性,重写是运行时的多态性返回不同—重载对返回类型没有要求,而重写要求返回类型,有兼容的返回类型参数不同—重载的参数个数、参数类型、参数顺序可以不同,而重写父子

2022-04-30 21:30:11 304

原创 c++钻石继承重复继承解决方案,以及啥是vfptr和bfptr

重复继承 novirtual+novirtualB继承A,而C也继承A。然后D继承B和C。这样就称为重复继承,因为看着像个菱形,所以也叫钻石继承那么这样继承会出现什么问题呢?我们先从内存分配的角度看。在VS使用 / d1 reportSingleClassLayoutXXX就能查看内存分配。具体如下:运行之后就能看到XXX类这里是VirClass类的分布情况。好的,切回正题。假设我们有个这样的代码正如刚刚那个继承图一样:B继承A,而C也继承A。然后D继承B和C。#include

2022-03-19 18:00:45 1376

原创 设定1000,0000范围以内,把阿拉伯数字转换为汉语数字

一一十一一百一十一一千一百一十一一万一千一百一十一一十一万一千一百一十一一百一十一万一千一百一十一一千一百一十一万一千一百一十一可以发现每一千是一个单位。所以我们可以把多数分成多个一千去单独处理。中间再额外添加一个万即可。所以就可以将问题转换成如何处理一个一万以内的数字的阿拉伯表示形式分情况讨论可以发现。1000 一千1100 一千一百1010 一千零一十这也可以分成三个部分 高位 +零+低位其中零和低位要么同时出现[1010]要么不出现[1100]所以我们只需要先依次把

2022-03-04 18:03:26 441

原创 Unity用OnPopulateMesh绘制自定义圆形遮罩超详解

下图是最终成品OnPopulateMesh这个函数的主要作用就是用于构建Mesh。然后参数VertexHelper就是一个容器,存放需要渲染的mesh信息。具体可以看https://zhuanlan.zhihu.com/p/33827367这篇文章介绍OnPopulateMesh的这个函数本来就只是绘制一个矩形(两个三角形就搞定了)。但是如果我们可以override它来实现不同的性状。那么如何绘制一个⚪呢?首先我们需要知道一个⚪是怎么组成的(指由三角形)没错,⚪是由一圈三角形组成,如果三角形

2022-02-18 16:52:21 2485

原创 C++ 各种Mutex详解

Mutex互斥锁解释mutex 类是能用于保护共享数据免受从多个线程同时访问的同步原语。mutex 提供排他性非递归所有权语义:调用方线程从它成功调用 lock 或 try_lock 开始,到它调用 unlock 为止占有 mutex 。线程占有 mutex 时,所有其他线程若试图要求 mutex 的所有权,则将阻塞(对于 lock 的调用)或收到 false 返回值(对于 try_lock ).调用方线程在调用 lock 或 try_lock 前必须不占有 mutex 。若 mutex 在仍为

2022-02-13 14:05:00 6509

原创 《Fundamentals Of Computer Graphics》虎书第三版翻译——第六章 矩阵变换

翻译

2021-12-26 23:36:06 1651

原创 指针数组,数组指针,指针函数,函数指针配合代码详细介绍

指针数组故名思意,本质是个数组,类似整数数组,字符数组一样,指针数组中的所有元素均为指针char *p[4];这就是一个指针数组,[]的优先级大于*。所以p先与[]结合形成数组,最后再与char*(指针)结合形成指针数组代码详解#include<iostream>using namespace std;int main(){ char* p[4];//指针数组:p是一个数组,数组里面类型为指针类型。 string str="1234"; puts("str

2021-12-06 20:35:49 539

原创 归并排序概念算法思想复杂度和实现

概念将两个有序数列合并成一个有序数列,我们称之为“归并”。算法思想归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。复杂度归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排

2021-12-02 12:00:00 191

原创 C++ 中struct和class的区别

C++ 中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,struct只能包含成员变量,不能包含成员函数。而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。C++中的 struct 和 class 基本是通用的,唯有几个细节不同:使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public属性的。class 继承默认是 private 继承,而 struct 继承默认是 .

2021-12-02 11:56:51 284

原创 《Fundamentals Of Computer Graphics》虎书第三版翻译——第五章 线性代数

或许图形学程序最常用的工具就是能对点或者向量进行变换的矩阵。在下一章节,我们可以看到如何用矩阵表示一个向量,以及如何用向量与方阵相乘表示不同基。我们还将描述如何使用这种乘法来实现向量的变换,如缩放、旋转和平移。在这一章中,我们从几何的角度来回顾基本的线性代数,在二维三维的情况下着重直觉感知和算法。熟悉线性代数的读者可以跳过本章。然而,即使对于这样的读者,也可能有一些启发性的珍闻,比如行列式的发展以及对奇异和特征值分解的讨论。图5.1。平行四边形的带符号面积是|ab|,在这种情况下,面积是正的。5.1

2021-12-01 21:09:19 1629

原创 基类的析构函数应该声明为虚函数

代码举例环节我们先看一下不申明为虚函数的析构函数的调用情况#include<iostream>using namespace std;class Human{public: Human() {}; ~Human() {cout << "析构 Human!" << endl;}; void Attack() { cout << "Human! Attack" << endl; };};class Hero :

2021-12-01 16:52:38 590

原创 继承有什么优缺点?

优点:● 提高代码的重用性:代码重用,减少创建类的工作量,每个子类都拥有父类的方法和属性;直接将已有的属性和行为继承过来,实现了功能的复用,节省了大量的工作。● 提高代码的易维护性:不同类之间的继承关系,让这些事务之间保持一定程度的一致性,大大降低了维护成本● 提高代码的可扩展性:在已有功能的基础上,更容易建立,扩充新的功能;扩展接口都是通过继承父类来完成的;● 使代码结构清晰:同属于一个继承体系的相关类,他们之间结构层次清晰,简化了人们对代码结构的认识。缺点:● 高耦合性:类与类之间紧密的结合

2021-11-29 15:17:34 1968

原创 C#迭代器

迭代器包含迭代器快的方法或属性。迭代器块本质是包含yield return或yield break语句的代码,只能用于以下返回类型的方法或属性:IEnumerableIEnumerableIEnumeratorIEnumerator根据返回类型,每个迭代器都有一个生成类型(yield type)。如果返回类型是非泛型接口,那么生成类型是object;如果返回类型是泛型接口,那么生成类型是该泛型接口实参的类型,比如IEnumerator的返回类型是string。简单的实例yield return

2021-11-26 16:46:49 1684

原创 C#隐式类型

类型术语人们对类型系统的共识可以分为 静态类型,动态类型,显式类型,隐式类型。静态类型和动态类型静态类型是面向编译器的,由编译器检查类型是否合法。动态类型则是在执行期,它决定某个表达式的具体含义(面向对象的多态)显式类型和隐式类型显式类型,会显式地给出所有相关的类型信息,包括局部变量,字段,方法参数或者返回类型。隐式类型,则允许开发者不给出具体的类型,而是通过其他机制根据上下文推断出来。隐式类型局部变量指使用了关键字var声明的变量。他的工作机制只是:省略类型名称,类型信息交由编译

2021-11-26 16:43:33 428

原创 HTTP和HTTPS的区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

2021-11-24 17:03:23 1931

原创 tcp三次握手/四次挥手

三次握手:{概括:首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。详细:{第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_REC.

2021-11-24 16:58:36 417

原创 对称加密和非对称加密

什么是对称加密技术?对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密也就是密钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,密钥较短,且破译困难,除了数据加密标准(DES),另一个对称密钥加密系统是国际数据加密算法(IDEA),它比DES的加密性好,而且对计算机功能要求也没有那么高对称加密算法在电子商务交易过程中存在几个问题:要求提供一条安全的渠道使通讯双方在首次通讯时协商一个共同的密钥。直接的面对面协商可能是不现实而且难于实施的,

2021-11-24 16:41:18 464

原创 Unity Raycast详解

射线检测的相关文档public static bool RayCast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);public static bool Rayca

2021-11-24 16:38:50 4822

原创 [游戏开发]性能优化

一、渲染模块降低Draw CallDC DrwaCall Unity DCDraw Call是渲染模块优化方面的重中之重,一般来说,Draw Call越高,则渲染模块的CPU开销越大。降低Draw Call的方法则主要是减少所渲染物体的材质种类,并通过Draw Call Batching来减少其数量。游戏性能并非Draw Call越小越好。这是因为,决定渲染模块性能的除了Draw Call之外,还有用于传输渲染数据的总线带宽。当我们使用Draw Call Batching将同种材质的网格模型拼合在一

2021-11-24 16:33:26 4235

原创 unity mono生命周期

Awake:当一个脚本实例被载入时Awake被调用。我们大多在这个类中完成成员变量的初始化OnEnable:当对象变为可用或激活状态时此函数被调用。Start:仅在Update函数第一次被调用前调用。因为它是在Awake之后被调用的,我们可以把一些需要依赖Awake的变量放在Start里面初始化。 同时我们还大多在这个类中执行StartCoroutine:进行一些协程的触发。要注意在用C#写脚本时,必须使用StartCoroutine开始一个协程,但是如果使用的是JavaScript,则不需要这么做。

2021-11-24 16:25:38 2634

原创 C++ 多态介绍详解

多态按字面的意思就是多种形态。同一个事物在不同场景下的多种形态,即调用同一函数会产生不同的行为。C++多态又分为两种编译期多态和运行期多态:1.在面向对象C++编程中,多态是面向对象三大特性之一(封装,继承,多态),他的原理是通过虚函数机制,在运行期间通过虚函数表指针与虚函数表去确定该虚函数的真正实现,所以这种多态被称为运行期多态。2.在泛型编程,多态基于template的巨现化与函数的重载解析。这种多态在编译器进行,所以这种多态被称为编译期多态。3.函数重载解析也是编译器多态。运行期多态程序在

2021-11-24 16:20:37 1045

原创 《Fundamentals of Computer Grahpics》虎书第三版翻译——第四章 光线追踪

光线追踪计算机图形学的基本任务之一是绘制三维物体:获取一个场景或模型(由许多在3D空间中排列的几何物体组成),并生成一个二维图像(从一个特定的视角观察到的物体的图像)。这和几个世纪以来建筑师和工程师通过绘制图纸来与他人交流设计的做法是一样的。从根本上说,渲染是一个以一组对象作为输入,并产生一个像素数组作为输出的过程。不管怎样,渲染需要考虑到每个对象对每个像素的贡献;一般它有两种处理方法。对于对象顺序渲染,依次考虑每个对象,并为每个对象查找和更新其影响的所有像素。对于图像顺序渲染,依次考虑每个像素,.

2021-11-23 04:56:55 3256

原创 《Fundamentals of Computer Grahpics》虎书第三版翻译——第三章 光栅化

光栅图片大多数计算机图形图像是通过某种光栅显像呈现给用户的。光栅显像的图像就是像素数组。Pixel(像素)是“图像元素”的缩写。一个常见的例子是平板电脑显示器或电视,它有一个小发光像素的矩形数组,可以通过单独设置不同的颜色来创建任何想要的图像。不同的颜色是由不同强度的红、绿、蓝光混合而成的。大多数打印机,如激光打印机和喷墨打印机,也是光栅设备。它们是基于扫描的:没有物理的像素网格,但图像是通过在网格上选定的点按顺序 沉积墨水绘制的。(打印机的颜色要复杂得多,至少要混合四种颜料。)光栅在图形输入设备中也很

2021-11-04 19:19:33 1040

原创 进程和线程,多线程,协程?

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.线程就是把一个进程分为很多片,每一片都可以是一个独立的流程。对操作系统来说

2021-11-01 17:58:20 169

空空如也

空空如也

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

TA关注的人

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