深信服凉经

 

目录

 

New失败会怎样?

C++里有GC机制吗,有哪些?

谈谈多态?

什么是哈希冲突?哈希冲突怎么解决?

为什么内存不对齐会引起程序崩溃

数组相加得到m(手撕代码)

判断是否是子串(手撕代码)


  • New失败会怎样?

C++ 里,如果 new 分配内存失败,默认是抛出异常的。

如果new分配成功,p == 0 就绝对不会成立;而如果分配失败了,也不会执行 if ( p == 0 ),因为分配失败时,new 就会抛出异常跳过后面的代码。如果你想检查 new 是否成功,应该捕捉异常

 try {
            int* p = new int[SIZE];
            // 其它代码
        } catch ( const bad_alloc& e ) {
            return -1;
        }

当然,标准 C++ 亦提供了一个方法来抑制 new 抛出异常,而返回空指针:

  int* p = new (std::nothrow) int; // 这样如果 new 失败了,就不会抛出异常,而是返回空指针
        if ( p == 0 ) // 如此这般,这个判断就有意义了
            return -1;
        // 其它代码

  • C++里有GC机制吗,有哪些?

  1. 引用计数算法
  2. Mark & Sweep 算法
  3. 节点复制算法
  4. 分代回收(前三个方法的融合)

  • 谈谈多态?

C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

C++ 支持两种多态性:编译时多态性,运行时多态性。
a、编译时多态性(静态多态):通过重载函数实现
b、运行时多态性(动态多态):通过虚函数实现。

多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。多态用虚函数来实现,结合动态绑定. 


  • 什么是哈希冲突?哈希冲突怎么解决?

hash冲突:就是根据key即经过一个函数f(key)得到的结果的作为地址去存放当前的key value键值对(这个是hashmap的存值方式),但是却发现算出来的地址上已经有人先来了。就是说这个地方要挤一挤啦。这就是所谓的hash冲突啦

hash冲突解决:

  1. STL 中 HashMap 解决冲突一般采用链表法,其特点是利用空间换时间,查找复杂度能达到常数级别。
  2. 通常还有一种解决冲突的办法,开放地址法,分别有线性探测(Linear probing)、二次探测(Quadratic probing)、二次哈希(Double hashing)三种方式。

链表法的解析:

开放地址法的解析:

没懂。


  • 为什么内存不对齐会引起程序崩溃

  1. 一般risc的芯片,都会要求字节必须对齐,否则就会有问题。
  2. 但是x86的芯片没有问题,当内存地址不对齐时,芯片会自动分两次读取数据,只是影响效率,不会有程序崩溃的危险。

内存对齐的好处:我们都知道内存对齐可以提高效率,具体来说就是减少内存访问次数

平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常.

硬件原因:经过内存对齐之后,CPU的内存访问速度大大提升。具体原因接下来举例解释

解析:

  1. 当数据从0字节开始的时候,直接将0-3四个字节完全读取到寄存器,结算完成了。
  2. 当数据从1字节开始的时候,问题很复杂,首先先将前4个字节读到寄存器,并再次读取4-7字节的数据进寄存器,接着把0字节,4,6,7字节的数据剔除,最后合并1,2,3,4字节的数据进寄存器,对一个内存未对齐的寄存器进行了这么多额外操作,大大降低了CPU的性能。

  • 数组相加得到m(手撕代码)

 


  • 判断是否是子串(手撕代码)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值