自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 UE4 Core模块阅读:Container - TArrayBuilder相关

这个类比较简单,可以理解为TArray的工厂类。 类似TArray,有两个模板参数: template<typename ElementType, typename Allocator = FDefaultAllocator> class TArrayBuilder; 一:构造函数: 二:一些接口 TArray对应函数的转接,返回*this。 三:TArray转换 operator type() ...

2020-07-27 17:46:21 351

原创 UE4 Core模块阅读:Container - TArray相关

源码版本 4.22.3 听闻4.25内存分配那做了较大的改变,暂且不看。。 本文是我在看ue4源码时做的笔记,如有不对的地方,还希望大佬可以指出来。 一:begin 文件所在位置: 第一个模板参数指代元素类型,第二个指内存分配器。 特别的,在 中有TArray的默认内存分配器的特化版本。 友元声明是为了能够使用另一种类型的TArray访问当前类型的TArray的私有成员。 二:几种构造函数 1.从原生数组构造,传入头指针和元素数量。 2.通过初始化列表构造。...

2020-07-14 20:56:40 1186 1

转载 c++异常机制(转载)

说明:本文转载。个人感觉写的非常好。 C++异常机制的实现方式和开销分析 白杨 http://baiy.cn   在我几年前开始写《C++编码规范与指导》一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了。没想到时隔几年以后才有机会把这个尾巴补完 :-)。 还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准。想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销。异常处理由于涉及大量底层内容,向来是 C++ 各种高级..

2020-08-27 11:32:41 302

原创 Effective Modern C++ 笔记六: lambda 表达式

std::find_if(container.begin(), container.end(), [](int val){return 0 < val && val < 10;}); 闭包是lambda式创建的运行期对象,根据不同的捕获模式,闭包会持有数据的副本或引用。 在上面,闭包就是作为第三个实参在运行期传递给std::find_if对象。 闭包类就是实例化闭包的类。每个lambda式都会触发编译器生成一个独一无二的闭包类。而闭包中的语句会变成它的闭包类成员函数的可执.

2020-07-27 14:57:26 362

原创 Effective Modern C++ 笔记五: 右值引用,移动语义和完美转发

形参总是左值,即使其类型是右值引用 void f(Widget&& w); w是个左值,即使它的型别是个指涉到Widget型别对象的右值引用。 条款23:理解std::move和std::forward std::move无条件地将实参强制转换成右值。 std::forward仅在某个特定条件满足时才执行同一个强制转换。 template<typename T> typename remove_reference<T>::type&&am...

2020-07-24 14:39:26 318

原创 Effective Modern C++ 笔记四: 智能指针

条款18:使用std::unique_ptr管理具备专属所有权的资源 std::unique_ptr实现的是专属所有权语义。为只移动型别。 可以自定义析构器: auto delInvmt1 = [](Investment* pInvestment){makeLogEntry(pInvestment); delete pInvestment;}; template<typename... Ts> std::unique_ptr<Investment, decltype(delInv

2020-07-23 15:10:04 294

原创 Effective Modern C++ 笔记三: 转向现代c++

条款7:在创建对象时注意区分()和{} std::vector<int> v{ 1, 3, 5};//v的初始元素为1,3,5 // class Widget { private: int x{0}; int y = 0; int z(0);//不可行 }; //对于不可复制的对象 例如std::atomic 却不能用=初始化 由此可见,在c++三种初始化表达式中,只有大括号适用于所有场合。 大括号初始化有一项新特性,它.

2020-07-22 18:08:04 369

原创 Effective Modern C++ 笔记二: auto

条款5:优先选用auto,而非显式型别声明 简化声明 auto defefLess = [](const auto& p1, const auto& p2) {return *p1 < *p2; }; 引入: std::function 这个是函数指针的一种推广,可以指涉任何可调用对象。若要创建一个std::function对象就必须指定欲指涉的函数的型别。 例如: bool(const std::unique_ptr<widget>&, cons

2020-07-21 14:17:23 343

原创 Effective Modern C++ 笔记一: 型别推导

读书笔记,外加一些自己测试的栗子。这本书讲了一些11 和 14的特性。 条款一:理解模板型别推导 形如: template<typename T> void f(ParamType param); f(expr); //从expr来推导T和ParamType的型别 情况一:ParamType是个指针或引用,但不是个万能引用 1.若expr具有引用型别,先将引用部分忽略。 2.再进行模式匹配。 情况二: ParamType是个万能引用 1.如果expr是...

2020-07-20 17:17:23 332

转载 C++11的for循环,以及范围Range类的实现

C++11支持range-based for循环。这是一个很方便的特性,能省挺多代码。以下代码就能很方便的遍历vector中的元素,并打印出来: 1 2 3 4 5 6 7 8 std::vector<int> int_vec; int_vec.push_back(1); int_vec.push_back(2); //如果要修改int_vec中的元素,将变量x声明为 int&

2020-07-16 14:39:00 1396

转载 c++中的 trivial destructor

如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如果特定定义了析构函数,则说明需要在释放空间之前做一些事情,则这个析构函数称为non-trivial destructor。如果某个类中只有基本类型的话是没有必要调用析构函数的,delelte p的时候基本不会产生析构代码, 在C++的类中如果只有基本的数据类型,也就不需要写显式的析构函数,即用默认析构函数就够用了,但是如果类中有个指向其他类的指针,并且在构造时候

2020-07-08 17:31:03 355

转载 Stable Matching Problem稳定匹配问题-----稳定婚姻算法

(一)问题的引出: 有N男N女,每个人都按照他对异性的喜欢程度排名。现在需要写出一个算法安排这N个男的、N个女的结婚,要求两个人的婚姻应该是稳定的。 何为稳定? 有两对夫妻M1 F2,M2 F1。M1心目中更喜欢F1,但是他和F2结婚了,M2心目中更喜欢F2,但是命运却让他和F1结婚了,显然这样的婚姻是不稳定的,随时都可能发生M1和F1私奔或者M2和F2私奔的情况。所以在做出匹配选择的时候(也就是结婚的时候),我们需要做出稳定的选...

2020-07-07 20:30:05 766

原创 22.左移字符串

题目: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 示例 1: 输入: s = "abcdefg", k = 2 输出:"cdefgab" 示例 2: 输入: s = "lrloseumgh", k = 6 输出:"umghlrlose" 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/pro...

2020-06-04 14:02:50 461

原创 21:和为s的两个数

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[2,7] 或者 [7,2] 示例 2: 输入:nums = [10,26,30,31,47,60], target = 40 输出:[10,30] 或者 [30,10] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/he-we.

2020-06-04 11:33:38 182

原创 20: 第一次只出现一次的字符

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。 示例: s = "abaccdeff" 返回 "b" s = "" 返回 " " 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解: class Solution { public: ..

2020-06-03 15:49:32 174

原创 19. 连续子数组的最大和

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释:连续子数组[4,-1,2,1] 的和最大,为6。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof 著作权归领扣网络所有。商业转载...

2020-06-03 15:34:06 220

原创 18. 最小的k个数

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 示例 1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例 2: 输入:arr = [0,1,2,1], k = 1 输出:[0] 限制: 0 <= k <= arr.length <= 10000 0 <= arr[i]<= 10000 来源:力扣(LeetCode) 链接:...

2020-06-03 14:57:48 285

原创 17.数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 5000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lc...

2020-06-03 14:33:01 204

原创 16. 包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0...

2020-06-03 12:00:28 151

原创 15. 顺时针打印数组

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入:matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7] 限制: 0 <= matrix.length <= 100 0 <= matrix[i].length&...

2020-06-03 11:32:21 397

原创 14.对称二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 例如,二叉树[1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 示例 1: 输入:root = [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:ro...

2020-06-02 14:32:29 143

原创 13.二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入: 4 / \ 2 7 / \ / \ 1 3 6 9 镜像输出: 4 / \ 7 2 / \ / \ 9 6 31 示例 1: 输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 解: /** * Definition for a binary tree node. * struct...

2020-06-02 14:21:34 127

原创 12.圆圈中最后剩下的数字

0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。 例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。 解: class Solution { public: int lastRemaining(int n, int m) { int last = 0; for(int i = 2;i&l.

2020-06-02 13:45:32 196

原创 11.构建乘积数组

给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。 示例: 输入: [1,2,3,4,5] 输出: [120,60,40,30,24] 我的解法: 注意不要使用双重循环 n方复杂度会超时。 class Solution { public: vector<int> constructArr(vector<int...

2020-06-02 12:07:28 155

原创 UE4 gbuffer結構

struct FGBufferData { // normalized float3 WorldNormal; // 0..1 (derived from BaseColor, Metalness, Specular) float3 DiffuseColor; // 0..1 (derived from BaseColor, Metalness, Specular) float3 SpecularColor; // 0..1, white for SHADINGMODELID_SUBSURF.

2020-05-19 12:11:27 2023

原创 Ue4 shading path 和 feauture level

static EShadingPath GetShadingPath(ERHIFeatureLevel::Type InFeatureLevel) { if (InFeatureLevel >= ERHIFeatureLevel::SM4) { return EShadingPath::Deferred; } else { return EShading...

2020-04-27 14:02:50 746

原创 UE4垃圾回收代码阅读笔记

源码版本: 4.22.3 一:自动GC部分 void UWorld::Tick( ELevelTick TickType, float DeltaSeconds ) { //略 GEngine->ConditionalCollectGarbage(); //略 } 下面将conditionCollectGarbage 方法自己的理解通过注释的方式记录。 ...

2020-03-23 18:27:06 2004

原创 GC算法 笔记:GC标记-压缩算法

将 GC标记-清除算法与GC复制算法相结合。 一:Lisp2算法 标记阶段结束后进入压缩阶段,压缩阶段缩小被标记节点之间的距离。 compaction_phase(){ set_forwarding_ptr() adjust_ptr() move_obj() } set_forwarding_ptr() { scan = new_address = $hea...

2020-03-16 10:47:18 343

原创 C++程序设计笔记: 六

1.转换函数 operator double() const { ... } 该类可以被转换为double。 2.non-explicit-one-argument ctor 隐式转换 与上面做比较。 两个一起存在时可能会导致二义性。 3.pointer-like classes 智能指针 ...

2020-03-14 20:18:55 176

原创 GC算法 笔记:GC复制算法

只把某个空间的活动对象复制到其他空间,把原空间里的所有对象都回收掉。 copying() { $free = $to_start for(r : $ roots) *r = copy(*r) swap($from_start, $to_start) } copy(obj){ if(obj.tag != COPIED) ...

2020-03-13 14:03:17 335

原创 GC算法 笔记:引用计数法

通过mutator在处理过程中通过增减计数器来进行内存管理,没有显式的开启GC的时机。 new_obj(size){ obj = pickup_chunk(size, $free_list) if(obj == NULL) allocation_fail() else obj.ref_cnt = 1 retur...

2020-03-12 14:00:00 290

原创 GC算法 笔记:标记-清除算法

标记阶段:把所有活动对象都做上标记的阶段。 清除阶段:把没有标记的对象也就是非活动对象回收的阶段。 伪代码: mark_sweep() { mark_phase() sweep_phase() } 一:标记阶段 mark_phase() { for(r : $roots) mark(*r) } mark(obj){ if(obj.ma...

2020-03-11 17:13:19 295

原创 GC算法 笔记

1.头 对象的大小 对象的种类 2.域 域中的数据类型: 指针 非指针 3.指针 4.mutator 生成对象,更新指针。可以理解为“应用程序”。 5.堆 动态存放对象的内存空间。 6.活动对象,非活动对象 能通过mutator引用的对象称为活动对象,不能被引用的称为非活动对象,非活动对象不能被再次引用。 7.分配 ...

2020-03-11 13:57:38 244

原创 c++面向对象程序设计 笔记五

1.static 静态和非静态成员 初始化, 单例模式 2.class template 3.funcation template 4.namespace using ......... 继承,复合,委托 1.composition(复合) has-a 构造和析构: 构造由内到外 (内部的默认构造函数,编译器添加的版本是调用默认构造) 析构由外到内 ...

2020-03-10 20:27:56 188

原创 More Effective C 学习笔记六: 杂项

1.在未来时态下开发程序 用c++语言来表达设计上的约束条件,而不是使用注释或者文档。 注意虚析构函数 等等 2.将非尾端类设计为抽象类 3.如何在同一程序中混合使用c++和c 确保产生兼容的obj文件 名变换 因为c没有函数重载,所以没有名称变换,所有需要显示告诉c++编译器不能对其他语言的函数进行名称变换, 使用 extern 'C'指示。不仅仅指示c语言, 通过只...

2020-03-10 13:38:15 268

原创 More Effective C 学习笔记 五:技巧

1.将构造函数和非成员函数虚拟化 ·考虑 class NewsLetter { public: NewsLetter(istream& str); ... private: static NLComponent* readComponet(istream& str); private: list<NLComponent*> com...

2020-03-10 11:36:18 208

原创 c++面向对象程序设计 笔记四

1.理解堆空间和栈空间 不同创建对象的方式。 2.local object 和 static local object的生命周期 3.heap object的声明周期 注意显式释放。 4. new 先分配memory 再调用ctor Complex *pc; void* mem = operator new(sizeof(Complex)); pc = static_cast&...

2020-03-04 21:52:22 124

原创 c++面向对象程序设计 笔记三

class with pointer member 1.三个特殊的函数 拷贝构造,拷贝赋值,析构 2.ctor 和 dtor

2020-03-04 21:14:32 161

原创 More Effective C 学习笔记四: 效率

1.理解80-20准则 2.考虑使用懒惰计算法 引用计数 例如string类做法 区别对待读取与写入 懒惰提取 :pointer to implemention的设计思路 懒惰表达式计算 3.分期摊还期望的计算 .提前计算分摊消耗 与上面是一种相反的思想,过度热情计算法 比如说使用缓存(在计算比较频繁或者相同的操作重复进行的时候考虑) .vector容器内存拓展逻辑 4.理解...

2020-03-04 14:29:04 235

原创 c++面向对象程序设计 笔记二

#带指针的类与无指针的类的区别。 1.头文件添加 guard 防卫式声明,防止重复引入头文件 2.头文件的布局 包括 前置声明 ,类声明,类定义 栗子: class complex { public: complex(double r = 0, double i = 0) :re(r), im(i) { } complex& operato...

2020-03-03 22:12:44 293

空空如也

空空如也

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

TA关注的人

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