这次是第一次笔试,被深深打击了,特将问答题重新整理一番,与诸君共勉;
inline函数;特点,优缺点,在编译期间如何处理
特点:
- inline是一种以空间换时间的做法,省去调用函数的额外开销,所以代码很长或者有递归循环的函数不适合使用
- inline对于编译器使用只是一个建议,编译器会自动优化,如果定义位inline的函数体内有函数/递归,就不会被调用
- inline修饰的函数不能让定义和声明分离,分离会导致连接错误,因为inline被展开时就没有函数地址了,连接就找不到了;
优点
- 减少函数调用所产生的系统开销
缺点
- 会造成代码膨胀;
- 当inline函数发生了改变,需要重新编译一遍才可以使用;
- 与部分调试器不兼容
在编译期间如何处理
- 在编译阶段C++编译器会在调用内联函数的地方展开;
智能指针如何实现,种类有哪些,在什么场景下用哪个
- 智能指针的种类:auto_ptr,unique_ptr,shared_ptr,weak_ptr
- 使用场景:
- auto_ptr:C98版本中出现,时单个对象独占资源,但因为并不安全,会造成野指针,所以基本不使用
- unique_ptr:C++11引入,是为了替代auto_ptr的,也是在单个对象使用资源的场景下使用,相较于auto_ptr,它可以作为容器中的元素,管理动态数组,自定义删除操作
- shared_ptr:C++11引入,为了解决前两者无法实现的,资源多对象共享的问题,也是在这种场景下使用
- weak_ptr:C++11引入,为了解决shared_ptr的循环引用问题而存在的一种辅助智能指针,重载operator*和->
- 智能指针如何实现:
RAII(资源可以自动释放)+operator*/operator->(当成指针使用)+解决浅拷贝的问题- RAII:将资源使用类的方式进行封装:在对象构造时获取资源,在析构函数中清理资源
- 浅拷贝的后果:多个对象共享同一份资源,在销毁对象时,同一份资源被释放多次导致代码崩溃
auto_ptr: 通过资源转移/资源所有者权限避免浅拷贝
unique_ptr:通过禁止拷贝构造和赋值运算符重载来避免浅拷贝;
shared_ptr: 通过资源计数器的方式避免浅拷贝和野指针;
关于智能指针的更多内容,参看我的博客:C++:智能指针