- 博客(210)
- 收藏
- 关注
原创 STL容器都知道哪些,都解释一下,原理是什么?
支持随机访问,随机访问的算法复杂度为 O (1)。当容器的容量不足时,会重新分配一块更大的连续内存空间(一般是原来容量的 2 倍),将原有的元素复制到新空间中,并释放原来的内存,以此实现扩容操作。:直接存储元素,元素是唯一且无序的,底层使用哈希表实现,通过哈希函数来判断元素是否存在,适合用于需要快速判断元素是否存在,且对元素顺序无要求的场景。:通过键值对进行存储,键是唯一的,元素是无序的,可以通过键快速查找并操作与之关联的值,底层使用哈希表实现,通过哈希函数将键映射到不同的桶中。
2025-03-14 21:38:35
208
原创 C++STL的六大部件和联系
迭代器:迭代器类似指针可以对容器内的元素进行遍历操作,容器提供的成员函数begin(),end()返回一个指向容器起始和结束的迭代器,这些迭代器是容器和算法之间的桥梁,因此,begin()和end()提供了容器元素的迭代器访问接口。空间配置器:空间配置器为容器提供内存管理服务,当容器需要分配新空间时,会调用空间配置器进行内存分配的工作。适配器:适配器可以将仿函数和函数进行包装和转换,可以对不同容器进行转换。C++STL六大部件:仿函数,算法,容器,迭代器,适配器,空间配置器。
2025-03-10 22:35:20
234
原创 智能指针用过吗,有哪些,他们的区别和各自的优缺点
3.weak_ptr是一种弱引用,主要是针对shared_ptr智能指针的循环引用做出的一种指针,通常用于打破shared_ptr的循环引用,还可以用于观察shared_ptr指向的对象是否存在与场景之中,与shared_ptr搭配使用,由于weak_ptr是一种弱引用,不会计入引用计数,没有对象的资源所有权,所以访问对象时需要使用lock对对象进行操作,所以使用起来比较复杂。cout<<"无法锁定对象,可能对象被销毁"<<endl;cout<<"无法锁定对象,可能对象被销毁"<<endl;
2025-03-10 11:58:58
824
原创 (C++)说说常见新特性有哪些
(另外一些编辑器可能会自动识别auto并且标注他代表的是什么,我对C++的使用经验比较少,C#之中也有类似的东西例如var,在使用rider进行游戏开发时,我们直接使用var,rider会对其进行翻译,并且直接将对应的内容呈现在开发面前,如果每一位开发者都是直接使用rider进行编程,那么可以直接使用var并且也不会降低代码的可读性,但是在某一些情况之下var的自动识别可能不太准确,这时候需要我们明确的表明使用的是哪一个类型)4.{}赋值,可以使用{}直接赋值一些数组,使用案例如上。
2025-03-10 11:00:48
804
原创 C++内存区域如何划分说一下(栈和堆那些)
栈区域主要用于存储局部变量,方法调用时的参数,返回的地址等。栈是一种后进后出的数据结构,这就意味着最后存储的内容出现在栈顶,也是第一个释放。全局/静态区域用于存储全局以及静态的变量,包括在方法之中的使用static标识符表示的变量以及在类之中使用static标识符表示的对象。常量区域用于存储C++之中的常量,例如字符串常量,常量整数等。代码区域用于存储可执行的逻辑,例如类之中的方法。C++内存区域包括栈区域,堆区域,全局/静态区域,常量区域以及代码区(文本区)。静态变量的生命周期贯穿于整个程序。
2025-03-09 20:41:55
412
原创 new和delete的使用解释一下,和malloc和free的区别
在C++之中使用new的时候会自动的调用构造函数,使用delete的时候会调用类对象的析构函数,所以适用于对类对象进行内存分配与释放。在C++之中的new和delete以及在C语言之中的malloc和free都是动态分配内存以及对动态分配的内存的释放。所以在一个对于一些简单的数据类型以及与C语言相关的内容时,可以采用malloc以及free进行内存分配以及释放。在C语言之中使用malloc和free只是简单的进行内存分配和释放不会调用构造函数以及析构函数。printf("内存分配失败!
2025-03-09 18:44:39
357
原创 指针的工作原理,函数的传值和传址
但是在C#之中使用ref 和out对实参的修改比在C++之中使用传址的方式更加安全,由于在使用ref和out的时候,编译器会对这部分进行检查,相对来说比较安全,但是C++之中如果操作不当,就会出现悬空指针的情况,所以使用C++进行传址的操作时需要小心。老规矩,我们开始思考C#与C++的区别,在C#之中虽然也可以使用指针,但是一般使用指针是函数处于一种不安全的模式之下,所以我们一般不考虑C#的指针使用。可以使用*ptr对指针进行解引用,解引用之后输出的结果是指针指向的对象的值。输出的结果是:1,2。
2025-03-09 17:47:50
395
原创 内存泄漏出现的时机和原因,如何避免?
例如基类的析构函数没有被派生类重写,导致当通过基类指针删除派生类时,只调用了基类的析构函数,派生类本身的一部分动态分配的内存没有被释放,导致一部分内容没有被正确的释放,这是析构函数被遗漏时可能发生的情况。C#相对于C++的内存泄漏问题比较少,这是由于C#的自动垃圾回收机制,会自动对一部分内存进行回收,大大降低了内存泄漏的风险,对于C++来说错误遗漏没有进行delete释放或者使用delete释放之后又使用了已经被释放的内容会出现悬空指针的问题。始终持有对方的智能指针的引用,引用计数始终不清零。
2025-03-09 12:54:27
340
原创 虚函数和虚表的原理是什么?
在C++之中不存在默认的虚函数,在C#之中也不存在默认的虚函数,但是如果C#中的类被声明成abstract,那么该抽象类之中的抽象方法默认都被认为是虚的,需要在子类中进行重写,不过抽象类中也可以存在非抽象的,非虚的,以及非抽象虚的方法。虚函数表(虚表)是一个用于存储虚函数地址的数组,每个包含 虚函数的类都存在一个虚函数表,编译器会为每一个包含虚函数的类分配一根虚函数指针(vptr),虚函数指针指向虚函数表,在运行时会根据虚函数指针找到虚函数表,然后根据虚函数的索引找到该虚函数的地址,然后调用函数。
2025-03-09 11:10:38
284
原创 C++数组,链表,二叉树的内存排列是什么样的,结构体占多大内存如何计算,类占多大内存如何计算,空类的空间是多少,为什么?
在C++之中类的内存由类内的非静态变量的大小决定,静态变量和非静态方法以及静态方法都不对其影响(静态变量和静态方法存储在内存之中和类的内存不同,静态方法不存在this指针,只能够调用静态变量,存在于全局之中,其生命周期贯穿整个程序,非静态方法由类的所有对象共享,调用非静态方法时,隐含的this指针指向实例对象,存储在代码段,所以不占据类的内存空间)C++链表是离散存储的,C++链表是由节点构成的,每个节点之中存在节点的值以及指向下一个节点的指针,每个节点是动态分配的。
2025-03-08 22:08:57
354
原创 C++什么是深复制和浅复制,构造函数和析构函数,哪一个可以写成虚函数,为什么?
对于C++之中的析构函数,我们都建议将其写成虚函数,原因在于在C++之中如果声明一个基类,指向一个派生类,如果不制作成虚函数,那么只会调用基类的析构函数,派生类之中可能需要释放的一些资源不会被正确的释放,这可能会产生C++内存泄漏,(注意内存泄漏不是真正的漏出去,而是只一些资源不能再被回收,之前的博客之中也有对这方面进行讲解)由于C++的浅拷贝是对于int等数值类型复制数值,对于指针类型复制内存地址,那么对于不同的指针可能会存在指向同一个内存地址的问题,如果删除了其中一个,另外一个则会出现悬空指针的问题。
2025-03-08 16:24:57
353
原创 C++ 构造函数、析构函数和复制构造函数
(调用GC的垃圾回收是一种昂贵的操作,所以只有实在要使用垃圾回收时才考虑调用)构造函数是用于初始化对象的一种函数,他的名称和类名相同,没有返回值,构造函数可以重载,如果不存在构造函数,c++会自动生成无参数的构造函数,如果自己声明了构造函数,C++之中任然存在无参构造函数,除非使用者显示的删除无参构造函数,在C++11之中我们可以使用default显示的声明一个无参构造函数。复制构造函数也叫拷贝函数,是一种用于将已存在的同类的不同对象的数据复制给另外一个对象的函数,一会儿针对这个例子给出对应的代码。
2025-03-08 15:57:41
526
1
原创 C# 中的Action和Func是什么?Unity 中的UnityAction是什么? 他们有什么区别?
所属范围: 和 是 C# 语言标准库中的委托类型,可在任何 C# 项目里使用; 是 Unity 引擎专门定义的委托类型,只能在 Unity 项目中使用。返回值: 和 封装的方法没有返回值; 封装的方法有返回值。使用场景: 和 适用于普通的 C# 开发场景,用于实现回调、事件处理等功能; 主要用于 Unity 项目中的事件系统,方便处理游戏对象的交互事件。上述部分用于复习记忆,为了使读者深入了解,下面对他们进行详细的代码描述。目录1.Action无参数的 Action带参数的 Action2.Func无
2025-03-04 19:23:24
339
原创 数组和链表的区别是什么?
这是一道面试题,数组是连续存储、支持随机访问但插入删除效率低的数据结构,链表是离散存储、插入删除高效但需顺序访问的数据结构。1。
2025-03-04 16:18:48
293
原创 Lua如何实现面向对象的三大特性?
Lua 本身没有像 Java、C# 那样内置的面向对象机制,但可以通过 Lua 的表(table)和元表(metatable)来模拟实现面向对象的三大特性:封装、继承和多态。
2025-03-04 14:12:16
455
原创 Unity中的Destroy和DestroyImmediate的区别是什么?
由于对象不会立即销毁,在对象被标记为待销毁状态到实际销毁期间,如果其他代码仍然尝试访问该对象,可能会导致意外的行为。,它会在当前帧的更新循环结束后,在渲染之前销毁指定的对象。如果一个脚本引用了即将被立即销毁的对象,销毁后该脚本可能会抛出空引用异常。适用于大多数需要销毁对象的场景,因为异步销毁不会影响当前帧的逻辑执行。例如,在敌人被击败后销毁敌人对象,或者在道具被使用后销毁道具对象等。例如,在编辑器脚本中,需要在创建对象后立即销毁它进行测试。,它会立即销毁指定的对象。,导致其他依赖该对象的代码出现错误。
2025-03-03 20:30:40
980
原创 在开发时,对string和StringBuilder我们应该如何选择
这是一道面试题,在 C# 开发中,string和都用于处理文本,但它们的特性不同,下面我们来进行详细的分析。1。
2025-03-03 15:13:22
1401
原创 C#重载运算符,重载 == 和 != 以及 万物之父Object基类中的虚方法 virtual bool Equals(Object obj) 对于我们的意义是什么?
运算符比较的是对象的引用是否相等,即是否指向内存中的同一个对象。而对于值类型,默认比较的是它们的值是否相等。隐藏提问:==和Equals的区别,请查看我的另外一篇博客,对这部分进行了详细的描述。在比较自定义类型的对象时,使用。运算符一样,比较的是对象的引用。运算符与比较内置类型的对象的语法一致,符合开发者的习惯。我们的自定义类型能够更好地融入 C# 的类型系统。,从而实现正确的查找和去重等功能,它使得。在 C# 中,对于引用类型,默认的。根据对象的实际类型来进行相等性比较。,默认情况下,它与引用类型的。
2025-03-03 14:44:03
175
原创 请说明字符串中 string str = null string str = ““ string str = string.Empty 三者的区别
null:表示变量没有引用任何字符串对象,在使用前需要先进行null检查,否则会引发异常。适用于需要表示 “没有字符串” 这种概念的场景。"":都表示一个空的字符串对象,二者在功能上等价,但可读性更好,并且在某些代码规范中更推荐使用。适用于需要初始化一个空字符串的场景。在性能方面,""和几乎没有区别,因为它们引用的是同一个空字符串实例。而 null不涉及字符串对象的创建,因此在内存占用上最小,但使用时需要额外的检查逻辑。
2025-03-02 23:59:13
298
原创 游戏中的成就系统,我们一般会使用设计模式中的哪种模式来制作?为什么?
在游戏中,成就系统通常会使用观察者模式策略模式来实现,具体取决于系统的复杂度和扩展性需求。
2025-03-02 23:14:45
664
原创 transform.forward和Vector3.forword的区别
是一个固定的、代表世界空间Z轴正方向的单位向量,不依赖于任何游戏对象。是一个动态的向量,它代表的是游戏对象自身局部坐标系下的前向方向在世界空间中的表示,会随着游戏对象的旋转而改变。
2025-02-27 11:14:50
310
原创 序列化是什么?常见的序列化方式有哪些?什么时候我们会用到序列化?
序列化(Serialization)是指将对象的状态信息转换为可以存储或传输的形式(如字节序列、XML 文档、JSON 字符串等)的过程。反序列化则是序列化的逆过程,它将存储或接收到的字节序列、XML 文档、JSON 字符串等转换回对象的状态信息。通过序列化,对象可以在不同的环境中进行持久化存储或网络传输,而反序列化则可以让接收方恢复出原始的对象。
2025-02-26 23:38:13
1505
原创 内存泄漏指什么?常见的内存泄漏有哪些?
内存泄漏是指程序在运行过程中,由于某些原因导致程序无法释放已经不再使用的内存,使得这部分内存持续被占用,最终可能导致系统可用内存逐渐减少,严重时会影响系统性能甚至导致程序崩溃。内存泄漏是指程序中已经分配的内存由于各种原因(如对象引用未正确释放、资源未关闭等),无法被垃圾回收机制回收,而不是真正意义上的 “漏出去”。例如,在 C# 中,如果一个静态集合类持有了对象的引用,并且在对象不再使用时没有将其从集合中移除,那么这些对象占用的内存就无法被回收,这就是一种内存泄漏的情况。
2025-02-26 22:04:44
424
原创 什么是闭包?可以举例说明
在 C# 中,是一个函数(或委托)与其捕获的外部变量的组合。闭包允许函数访问并记住其词法作用域中的变量,即使该函数是在原始作用域之外执行的。
2025-02-26 16:50:54
327
原创 什么是DrawCall?DrawCall为什么会影响游戏运行效率?如何减少DrawCall?
DrawCall(绘制调用)是 GPU 的一个指令,用于通知 GPU 渲染一个或多个对象。每次 DrawCall 会触发 GPU 执行一次完整的渲染流程(如顶点处理、纹理采样、着色等)。在 Unity 中,每个材质不同的物体、不同的纹理或不同的着色器参数,通常都会产生独立的 DrawCall。2。
2025-02-25 23:04:51
439
原创 Unity是否支持写成多线程程序?如果支持的话需要注意什么?
这是一道面试问题,下面我们来对这个问题进行分析。1在unity之中可以使用TaskThreadPool【Unity API 基于单线程设计,未做线程安全处理,所以在unity之中存在专为 Unity 设计的多线程框架,可以使用unity多线程。需要注意的一点是:协程并非真正的多线程(协程是主线程上的 “分时任务”。),而是基于迭代器的分时复用技术(这部分在之前的博客之中有所提及),代码仍在主线程运行,但可暂停执行以避免阻塞。2。
2025-02-25 22:36:28
366
原创 请简述一下对象池,在游戏开发中我们什么时候会用到它?
对象池(Object Pool)是一种创建和管理对象的设计模式。它的核心思想是预先(或者合适时机)创建一定数量的对象并存储在一个 “池” 中,当需要使用对象时,直接从池中取出一个可用的对象;当对象使用完毕后,不进行销毁,而是将其放回池中,以便后续再次使用。一些具有复杂模型和纹理的游戏对象,如大型怪物、建筑等,创建这些对象需要加载模型数据、纹理资源等,成本较高。使用对象池可以在游戏开始时预先创建这些对象,在需要使用时直接从池中取出,避免了重复的加载和创建过程,提高游戏的响应速度。
2025-02-24 11:25:01
1370
原创 Unity使用IL2CPP打包时,我们应该注意什么?如何避免(可以举例说明)
这一篇部分内容在Unity之中如何处理C#底层代码那篇博客之中有提及,接下来对这部分进行补充说明。(请先阅读--Unity之中如何处理C#底层代码)1。
2025-02-23 23:36:25
320
原创 请简述一下Prefab(预制体)的本质是什么?
实例是预制体的具体表现,它们继承了预制体的属性和功能。而实例的独立修改也可以选择应用回预制体,实现两者之间的双向更新)(预制体就像一个模板,对预制体本身的修改会自动应用到所有基于该预制体创建的实例上。例如,如果修改了角色预制体的动画参数,那么场景中所有该角色预制体的实例都会更新为新的动画设置。这些配置信息包括游戏对象的层级结构、组件设置、材质、脚本等,使得开发者可以基于这个模板快速创建多个具有相同属性和功能的实例(在 Unity 中,Prefab(预制体)是一种非常重要的资产类型。组件(用于物理模拟)、
2025-02-23 23:23:16
265
原创 浅拷贝和深拷贝的区别?可以举例说明
在编程中,浅拷贝和深拷贝是用于复制对象的两种不同方式,它们的主要区别在于复制对象时对对象内部成员的处理方式。今天我们对此进行讨论。1。
2025-02-23 23:02:38
339
原创 请说说你认为C#中 == 和 Equals 的区别是什么?
=运算符在值类型比较时比较值的内容,在引用类型比较时默认比较引用,但某些引用类型(如string)会重载该运算符以比较内容。Equals方法在值类型比较时比较值的内容,在引用类型比较时默认比较引用,但很多类会重写该方法以比较内容。在使用Equals方法时需要注意空引用的处理,避免抛出异常。
2025-02-23 22:20:00
396
原创 请简述Unity中协程的原理
在 Unity 中,协程(Coroutine)是一种特殊的函数,它可以暂停执行并在之后的某个时间点继续执行,这为开发者处理异步操作提供了便利。Unity 中的协程是一种基于迭代器模式实现的异步编程机制,它通过语句暂停和继续执行,由协程管理器进行管理,为开发者提供了一种简单、高效的方式来处理异步操作。1。
2025-02-23 14:42:11
889
原创 Application.streamingAssetsPath 和 Application.persistentDataPath两个路径有何区别?对于我们的意义是什么?
1。
2025-02-23 12:39:47
747
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人