对C++17类库中any万用类容器进行执行速度创新的Any

      相信打开本篇文章的读者都应该了解C++中的any是什么,就算不知道C++17的any也应该知道boost库的any,如果还不知道那就把它当作是C#或者Java里的Object类,也就是万用类型。

重点:作者也研究出了一种Any容器,看标题就感觉很nb。

步骤:1、首先与C++17的any进行运作速度、内存使用、功能等进行对比

           2、介绍实现思想

           3、测试编辑器Visual Studio 2017,笔记本cpu i7-7700hq,8g2133内存

运行速度与内存使用对比:

       图右侧是VS2017的性能分析器

       创建1000个string类型并对其进行赋值对比,作者的10毫秒,内存使用1016kb ,C++的36毫秒,内存使用493 kb,指定类型的27毫秒,内存使用1 kb。

       总结作者的比其他两者速度快3.5倍以上,内存比C++的多一倍,内存最优的是指定类型。

对C++17类库中any万用类容器进行执行速度创新的Any

创建1000个类对象并对其进行赋值对比,作者的16毫秒,内存使用1mb ,C++的22毫秒,内存使用493 kb,指定类型的32毫秒,内存使用1 kb。

       总结作者的比C++的快25%,比指定类型快一倍,但内存比C++的多一倍,指定类型还是最优内存。

对C++17类库中any万用类容器进行执行速度创新的Any

创建1000个整型数据并对其进行赋值对比,作者的4毫秒,内存使用876 kb ,C++的3毫秒,内存使用488 kb,指定类型的1毫秒,内存使用876 kb。

总结C++的速度快1毫秒,内存比其他两者少一倍

对C++17类库中any万用类容器进行执行速度创新的Any

读取1000个类对象对比,作者的434毫秒,内存使用1mb,C++的445毫秒,内存使用1mb,指定类型的465毫秒,内存使用1mb。

总结,这次作者完胜后两者,虽然只胜20+毫秒哈哈

对C++17类库中any万用类容器进行执行速度创新的Any

两个any创建需要内存对比,作者的8bytes,C++的64bytes,秒杀。

对C++17类库中any万用类容器进行执行速度创新的Any

功能对比:

两者都可以直接赋值系统自带类型值

对C++17类库中any万用类容器进行执行速度创新的Any

两者都可以在之后跟系统自带变量一样继续被赋值,且可以进行被赋值自定义类对象。

对C++17类库中any万用类容器进行执行速度创新的Any

C++17的any不可以装作者,而作者却可以装它。

对C++17类库中any万用类容器进行执行速度创新的Any

垃圾回收:

C++中的any并没有垃圾自动回收机制,可能是因为继承优良传统吧。而作者的Any是有垃圾回收功能的,当你不再使用它时它会被GC掉。你可以用成员函数打开一个开关来设置是否同时销毁它内部所指向的空间,不过这种操作要谨慎,因为外部可能有其他指针引用该空间,如果进行销毁了,那么其他引用它的指针就会变成野指针。

对C++17类库中any万用类容器进行执行速度创新的Any

垃圾回收其实就是用了C++的智能指针unique_ptr所实现。

实现原理:

对C++17类库中any万用类容器进行执行速度创新的Any

 

用途:                                                                                                                               

       当一个类中聚合了很多不同的类对象时,这个时候就可以使用它作为一个列表的类型,这样就能把这些类对象存在当前列表中。经常有时候其他类需要使用另外一个类里聚合的多个不同的类对象,这时候直接返回用储存着any的容器就行,代码简洁方便。

总结:

       作者的any是通过消耗进程内存来获得速度,甚至保存类对象比指定类型的速度更快好几倍,所以呢它可以用到需要速度而不太考虑内存的地方。作者的any在创建消耗进程内存是C++的一倍,这是它的缺点,日后作者会再接再厉进行优化内存。

下载源代码