1、静态多态和动态多态

静态多态:函数重载,模板。编译期间完成。

动态多态:虚函数。运行期间实现。

2、模板的实现和优缺点

函数模板的代码并不能直接编译成二进制代码,而是要实例出一个模板实例。写了模板的实现(定义)后,编译器在遇到需要实例的情况时才会进行实例。

优点:

增加了代码的重用性和可扩展性。减少开发时间。

缺点:

1.编译器不支持对模板的分离式编译,即所有基于模板的算法的定义实现都要放在头文件中,否则编译时可能不能生成模板的实例,使得在链接时报错。(也就是说,模板的定义都要放在.h文件中,不能声明放.h定义放.cpp)

2.可读性不好,调试困难。

3、构造、析构函数和抛出异常

能在析构函数中抛出异常吗?

语法上可以,但是实际中不能抛出异常。

1. 析构函数中抛出异常会打断他做的事情,可能无法释放申请的内存。

2. 如果无法避免析构函数抛出异常,那么应该让析构函数捕获任何异常,然后选择消化异常或者终止程序。

3. 析构函数抛出异常,然后进行栈展开寻找异常处理,栈展开过程中会自动清空函数的局部变量,调用函数中对象的析构函数,如果这时候又抛出一个异常,因为C++只能执行一个异常,程序会自动调用std::terminate(),终止程序。

能在构造函数中抛出异常吗?

构造函数可以抛出异常,但是要避免内存泄露。

1. 构造函数中抛出异常,该对象就没有被完全构造,就不会调用析构函数。那么已经new的对象就不会被释放,可能造成内存泄漏。

2. 解决的方法:一个是使用智能指针;二是捕获所有的异常,然后把申请的资源释放,再重新抛出异常。

4、构造、析构函数和虚函数

语法可以,但是实际中不能这么做。

不能在构造函数中调用虚函数?

在构建派生类对象时,基类的构造函数会先被调用,如果基类的构造函数中调用了虚函数,这时候调用的虚函数是基类版本的虚函数,而不是预想中的派生类的虚函数。因为基类的构造函数先调用,此时派生类的成员对象还未初始化,所以调用派生类的虚函数是不安全的。而且虚函数表指针是在构造函数中初始化的,不初始化调用不了正确的虚函数。

不能在析构函数中调用虚函数?

同理,派生类会先析构,再调用父类的析构函数。如果此时父类的析构函数调用了虚函数,那么只能调用父类版本的虚函数。

5、STL里的内存池实现

内存池概念

如果每次申请内存都向系统申请,因为操作系统分配内存很费时的,那么频繁的申请空间就会很耗时。内存池就是先向系统申请一大块内存,然后用户需要的时候再划分一部分给用户,这样效率高。

两级配置器

对于分配128byte的空间,使用第一级配置器以malloc,free实现;

分配小于128byte空间,则使用第二级配置器,用内存池管理。每次配置一大块内存,维护对应的16个自由链表(free-list)。自由链表分别管理大小为8、16、24、...、128的数据块,每次对于申请的大小在自由链表中找出一个满足的块。

指针数组+自由链表

内存池实现:

指针数组中第一个指针指向8byte块的自由链表,第二个指向16byte块自由链表,以此类推。

要分配一个块,那么先找出第一个满足要求的8的倍数的块,然后在指针数组中找到对应的位置,如果还有空闲块,就分配链表头的块出去,更新链表头的块;如果不足,则重新申请(默认20个)空闲块,然后分配。回收时同理,把回收的块放到链表头。

union obj{
union obj *next;//当使用next时、Obj所代表的的就是指向下一个节点的指针
char client[1]; //当使用data时、Obj本身就是实际的块空间
}

参考资料:

C++模板的定义是否只能放在头文件中?

Effective C++读书笔记(8): 析构函数不能抛出异常

SGI STL中内存池的实现

C++ part9的更多相关文章

  1. MMORPG大型游戏设计与开发(客户端架构 part9 of vegine)

    时间在人们的生活中是多么重要的东西,如果打乱了时间,不知道这个时间会成什么样子.在客户端中,自然也有时间模块,因为不同的时间可能会处理不同的事情,特别是在追求高度自由化的同时,时间也成为了一个很重要的 ...

  2. Python重写C语言程序100例--Part9

    ''' [程序71] 题目:编写input()和output()函数输入,输出5个学生的数据记录. 1.程序分析: 2.程序源码: 使用list来模拟结构(不使用class) stu = [strin ...

  3. part9 公用图片画廊组件拆分

    1.src中创建 common 再创建 gallery.然后gallery.vue 2.build 中webpack.base.conf 中配置更短路径 module.exports {}中 reso ...

  4. Atitit.attilax软件研发与项目管理之道

    Atitit.attilax软件研发与项目管理之道 1. 前言4 2. 鸣谢4 3. Genesis 创世记4 4. 软件发展史4 5. 箴言4 6. 使徒行传 4 7. attilax书 4 8. ...

  5. 浪潮 NF5240M3 ,NP5540M3 服务器安装2008 R2

    1,服务器系统的安装会出现错误的地方一般都是在Raid 卡驱动 略过Raid 卡配置, 具体 http://jingyan.baidu.com/article/ca41422fddfd201eae99 ...

  6. R12_专题知识总结提炼-AR模块

    应收模块简介 应收模块是用来为企业提供应收款管理的模块. 当企业销售一笔商品或者发生其他影响收入和现金的业务的时候,需要在应收模块记账. 本文档以R12为例,11i可参考,只针对简单业务情况考虑,将应 ...

  7. SHELL实现同时操作多个服务器:服务器批量管理

    引言:     1.如果你想知道你所管理的几万台服务器的/home分区使用率是多少.     2.如果你想为你所管理的几万台服务器添加同一个计划任务你该怎么办?     3.如果你想让你所管理的几万台 ...

  8. javascript的基本语法、数据结构

    本篇学习资料主要讲解javascript的基本语法.数据结构      无论是传统的编程语言,还是脚本语言,都具有数据类型.常量和变量.运算符.表达式.注释语句.流程控制语句等基本元素构成,这些基本元 ...

  9. 在node.js中使用mongose模块

    对象与文档相对应 创建项目目录,用root进入 # mkdir /home/test/part9/ 直接# npm install mongoose,报错如下 ../node_modules/nan/ ...

随机推荐

  1. ASP.NET Core错误处理中间件[4]: 响应状态码页面

    StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件类似,它们都是在后续请求处理过程中"出错"的情况下利用一个错误处 ...

  2. Spring Boot(IDEA,Gradle)超详细用户管理项目(一)——Hello World

    1.构建工具的配置(Gradle):自定义-所有设置:构建.执行.部署-构建工具-Gradle: 设置Gradle用户主目录:(该目录相当于仓库,gradle将下载所需依赖到此目录下),此目录下可新建 ...

  3. 面试常问的ArrayQueue底层实现

    public class ArrayQueue<T> extends AbstractList<T>{ //定义必要的属性,容量.数组.头指针.尾指针 private int ...

  4. 前端面试准备笔记之JavaScript(04)

    01. DOM的本质 xml是一种可扩展的标记性语言,可扩展就是可以描述任何结构的数据,他是一棵树,可以自定义标签,可以自己扩展. html也是一种特定的xml,他规定了一些标签的名称,结构与xml是 ...

  5. java虚拟机入门(一)-jvm基础

    转行学java之前,总是听着大佬们说着java像个渣男一样可以跨平台,一次编译到处运行,瞬间,我就坚定了学java的信念,哎呀妈呀,得劲.真的学java之后,好像渣男也不是那么好学的,尤其这货的必杀技 ...

  6. DP 状态 DP 转移方程 动态规划解题思路

    如何学好动态规划(2) 原创 Gene_Liu LeetCode力扣 今天 算法萌新如何学好动态规划(1) https://mp.weixin.qq.com/s/rhyUb7d8IL8UW1IosoE ...

  7. SQL解析工具

    面对复杂的SQL可用这个SQL解析工具,分析出用到了哪些表哪些字段: http://107.170.101.241:8080/getTableColumn/

  8. 进程通信类型 管道是Linux支持的最初Unix IPC形式之一 命名管道 匿名管道

    管道 Linux环境进程间通信(一) https://www.ibm.com/developerworks/cn/linux/l-ipc/part1/index.html 管道及有名管道 郑彦兴200 ...

  9. loj10095 间谍网络

    题目描述由于外国间谍的大量渗入,国家安全正处于高度危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍接受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报.所 ...

  10. 提高 Kafka 吞吐量

    提高 Kafka 吞吐量 1.了解分区的数据速率,以确保提供合适的数据保存空间 2.除非您有其他架构上的需要,否则在写 Topic 时请使用随机分区 3.如果 Consumers 运行的是比 Kafk ...