相信打開本篇文章的讀者都應該瞭解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++的多一倍,內存最優的是指定類型。
創建1000個類對象並對其進行賦值對比,作者的16毫秒,內存使用1mb ,C++的22毫秒,內存使用493 kb,指定類型的32毫秒,內存使用1 kb。
總結作者的比C++的快25%,比指定類型快一倍,但內存比C++的多一倍,指定類型還是最優內存。
創建1000個整型數據並對其進行賦值對比,作者的4毫秒,內存使用876 kb ,C++的3毫秒,內存使用488 kb,指定類型的1毫秒,內存使用876 kb。
總結C++的速度快1毫秒,內存比其他兩者少一倍
讀取1000個類對象對比,作者的434毫秒,內存使用1mb,C++的445毫秒,內存使用1mb,指定類型的465毫秒,內存使用1mb。
總結,這次作者完勝後兩者,雖然只勝20+毫秒哈哈
兩個any創建需要內存對比,作者的8bytes,C++的64bytes,秒殺。
功能對比:
兩者都可以直接賦值系統自帶類型值
兩者都可以在之後跟系統自帶變量一樣繼續被賦值,且可以進行被賦值自定義類對象。
C++17的any不可以裝作者,而作者卻可以裝它。
垃圾回收:
C++中的any並沒有垃圾自動回收機制,可能是因爲繼承優良傳統吧。而作者的Any是有垃圾回收功能的,當你不再使用它時它會被GC掉。你可以用成員函數打開一個開關來設置是否同時銷燬它內部所指向的空間,不過這種操作要謹慎,因爲外部可能有其他指針引用該空間,如果進行銷燬了,那麼其他引用它的指針就會變成野指針。
垃圾回收其實就是用了C++的智能指針unique_ptr所實現。
實現原理:
用途:
當一個類中聚合了很多不同的類對象時,這個時候就可以使用它作爲一個列表的類型,這樣就能把這些類對象存在當前列表中。經常有時候其他類需要使用另外一個類裏聚合的多個不同的類對象,這時候直接返回用儲存着any的容器就行,代碼簡潔方便。
總結:
作者的any是通過消耗進程內存來獲得速度,甚至保存類對象比指定類型的速度更快好幾倍,所以呢它可以用到需要速度而不太考慮內存的地方。作者的any在創建消耗進程內存是C++的一倍,這是它的缺點,日後作者會再接再厲進行優化內存。