C/C++超级大火锅的实现形式

一、new 跟 malloc 的区别是什么?

1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符

2.new能够自动分配空间大小

3.对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能对对象完成动态内存分配和初始化工作的运算符new,以及一个能对对象完成清理与释放内存工作的运算符delete—简而言之 new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能

new 是一个操作符,可以重载
malloc 是一个函数,可以覆盖
new 初始化对象,调用对象的构造函数,对应的delete调用相应的析构函数
malloc 仅仅分配内存,free仅仅回收内存

二、写时拷贝

有一定经验的程序员应该都知道Copy On Write(写时复制)使用了“引用计数”,会有一个变量用于保存引用的数量。当第一个类构造时,string的构造函数会根据传入的参数从堆上分配内存,当有其它类需要这块内存时,这个计数为自动累加,当有类析构时,这个计数会减一,直到最后一个类析构时,此时的引用计数为1或是0,此时,程序才会真正的Free这块从堆上分配的内存。
引用计数就是string类中写时才拷贝的原理!

什么情况下触发Copy On Write(写时复制)
很显然,当然是在共享同一块内存的类发生内容改变时,才会发生Copy On Write(写时复制)。比如string类的[]、=、+=、+等,还有一些string类中诸如insert、replace、append等成员函数等,包括类的析构时。

三、使用引用应该注意什么?

《C++高级进阶教程》中指出,引用的底层实现由指针按照指针常量的方式实现,见:C++引用的本质。非要说区别,那么只能是使用上存在的区别。

  1. 引用就是对某个变量其别名。对引用的操作与对应变量的操作的效果完全一样。
  2. 申明一个引用的时候,切记要对其进行初始化。 引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只 表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也 不给引用分配存储单元。
  3. 不能建立数组的引用。 // 数组的元素不能是引用
  4. 定义引用的类型,是编译时确定的, int a = 6; double &b = a;

四、如何和一个函数共享一块内存地址

如果不用修改指针,只要传指针过去,那边用指针接收,如果需要修改指针。

指针的引用方法如下:

#include <stdio.h>
void allocatmemory(float *&data)
{
data=new float[100];
}
int main()
{
float *data = NULL;
allocatmemory(data);
if(!data)
{
printf(“data is null\r\n”);
}
else
{
printf(“data has been allocated memory.\r\n”);
delete []data;
data = NULL;
}
}

还有一种方法是利用指针的指针。

五、c++中多态体现

编译时多态:编译期确定,重载,模板元编程
运行时多态:虚函数,晚绑定

六、虚函数表存放的位置,一个类有多少个虚函数表?

虚函数表的指针存在于对象实例中最前面的位置。虚函数表是类所拥有的,程序运行过程中不能够修改,它存放在常量区。

一个类若继承了多个含有虚函数的基类,那么该类就有对应数量的虚函数表。

七、vector、deque、list、set、map区别

1、vector

相当于数组。在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。

优点:

(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组进行动态操作。通常体现在push_back() pop_back()

(2) 随机访问方便,即支持[ ]操作符和vector.at()

(3) 节省空间。

缺点:

(1) 在内部进行插入删除操作效率低。

(2)只能在vector的最后进行push和pop,不能在vector的头进行push和pop。

(3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放

2、list

双向链表。每一个结点都包括一个信息块Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。

优点:

(1) 不使用连续内存完成动态操作。

(2) 在内部方便的进行插入和删除操作

(3) 可在两端进行push、pop

缺点:
(1)不能进行内部的随机访问,即不支持[]操作符和vector.at()
>
(2)相对于verctor占用内存多

3、deque

双端队列 double-end queue
deque是在功能上合并了vector和list。

优点:

(1) 随机访问方便,即支持[ ]操作符和vector.at()

(2) 在内部方便的进行插入和删除操作

(3) 可在两端进行push、pop

缺点:

(1) 占用内存多

使用区别:

(1)如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

(2)如果你需要大量的插入和删除,而不关心随即存取,则应使用list

(3)如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

4、map是,key-value对集合

5、set,就是key=value的map

欢迎使用66资源网
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!

66源码网 » C/C++超级大火锅的实现形式

提供最优质的资源集合

立即查看 了解详情