当前位置:   article > 正文

【游戏开发岗面经总结3】(c#托管和非托管类型,链表和数组的优缺点(顺序存储和链式存储),红黑树的特性,c#的拆装箱,static关键字,c++类型转换,const关键字)_托管的类不能是标准数组

托管的类不能是标准数组

c#托管和非托管类型

GC当系统内存资源匮乏的时候,然后自动的去释放那些没有使用的托管资源

托管就是GC帮你管理内存以及资源的释放,不需要程序员自己去控制,对象只针对于托管资源,不回收非托管资源
比如数组,用户定义的类,接口,委托,object,字符串等引用类型,栈上保存一个地址,当栈释放之后,对象也就没有用了
但是int string float 等的值类型,GC会自动释放其内存,不需要GC来回收

对于非托管资源,GC只能跟踪非托管资源的生存期,而不知道如何释放它
这样就出现了资源使用不尽的时候,不能提供资源能够提供的服务,windows的运行速度会变慢
比如你连接了数据库,用完之后你没有显式释放数据库资源,如果还是不断地申请一个数据库资源
到时候程序会抛出一个异常

链表和数组的优缺点

数组的特点
存放在内存中一块连续的区域
数组需要预留空间,可能出现数据溢出和内存浪费的情况
插入数据和删除数据的效率低,插入一个数据,后边的数据都要向后移动
随机读取的效率很高,因为地址连续
并不利于扩展,数组定义的空间不够的时候,需要重新定义数组

链表的特点
存放的内存不需要连续
每一个数据都同时保存了下一个数据的地址
插入和删除数据的效率高
查询数据的效率低,不具有随机访问性
不指定大小,扩展方便,数据随意增加

各自优缺点
数组:随机访问性强,查找速度快
链表:插入删除速度快,内存利用率高,不易造成浪费,大小没有固定扩展灵活

缺点:
数组:插入删除效率低,可能造成数据溢出和内存浪费,内存空间要求高,需要连续的空间,大小固定不能扩展
链表:不能随机查找,必须从第一个数据开始遍历,效率低

由数组和链表可以引申到顺序存储和链式存储上去

顺序存储的存储密度是100%,没有空间的浪费,链式存储中处理存放数据还有指针,所以没有达到100%
顺序存储需要多少空间是需要实现决定的,而链式存储是动态分配的更加灵活

时间性能上,对于查找,读取顺序存储更好
对于删除插入等操作 链式存储更好 和数组和链表是相同的道理

红黑树的特性

1.红黑树的节点是红色和黑色
2.红黑树的根节点是黑色
3.红黑树的叶子节点是黑色的空节点
4.红黑树中红色节点的两个子节点都是黑色的,路径上不能出现两个连续的红色节点
5.人一个节点到叶子节点的所有路径上包含相同数量的黑节点

内联函数inline

inline在编译的时候,编译器将内联代码复制到调用内联的地方
优点:在代码简短的情况下,如果频繁调用普通函数,会因为压栈而造成时间和空间的消耗 内联可以优化这个问题
缺点:代码长而且复杂的情况下,使用内联会复制到调用的地方,编译之后产生机器码造成冗余

内联函数具体介绍

c#拆装箱

装箱
在堆上为新的对象实例分配内存。该对象实例包含数据,但没有名称;

在栈上值类型变量的值复制到堆上的对象中

将堆上创建的对象的地址返回给引用类型变量如代码:

拆箱就是将引用类型转换成为值类型的过程
拆箱并不是将装箱过程颠倒过来,拆箱的代价比装箱的代价低好多

获取已装箱的对象的地址

将值从堆上的对象中复制到堆栈上的值变量中

拆装箱的操作会对应用程序的速度和内存消耗产生不利的影响(消耗内存,增加垃圾回收次数,复制操作等)
所以我们要避免编译器在什么时候自动拆装箱

c++ static关键字

作用于函数内部的局部变量的时候,当函数再次调用的时候,其变量还会保持上一次的值
函数内部的静态变量只开辟一次空间不会因为多次调用产生副本,也不会因为函数返回而失效
当static作用于类内成员时,由该类所有对象共同维护和使用,从而实现同一个类的不同对象数据共享。
访问静态数据成员方式:类名::标识符
对静态数据成员初始化:在类定义外进行

其他方法可以直接调用静态函数成员

c++四种类型转换

const_cast 用于去除const属性
static_cast用于基本类型转换
dynamic_cast用于多态类之间的转换
reinterpret_cast 用于不同指针类型的转换

希望我所写的对大家有所帮助吧

const关键字

通俗:const离谁近 谁就不能更改,防止无意的代码的修改,可减少bug的出现
提供了更灵活,更安全的方式定义常量
占用存储单元,地址,可以用指针指向const关键字修饰的变量,但是不能修改
清除了#define的不安全性 有更良好的编译时检测性

作用:
提供了更灵活,更安全的方式定义常量
占用存储单元,地址,可以用指针指向const关键字修饰的变量,但是不能修改
清除了#define的不安全性 有更良好的编译时检测性

指向常量的指针:不允许改变指针所指地址中的数据 可以改变指针所指地址

 const int *j = &i;  //指针,指向int型常量
  • 1

常指针:不允许改变指针所指地址,可以改变指针所指地址中的数据

int *const j = &i;  //常指针, 指向int型变量
  • 1

指向常量的常指针:以上两种的结合 不能改变指针所指的地址,不能改变指针所指地址中的数据

const int *const j = &i; //指向int常量的常指针
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/664603
推荐阅读