2017-04-13 103 views
12

llvm::SmallVector<T,N>實現被分割以及很多類型:爲什麼llvm :: SmallVector拆分其存儲?

爲什麼是兩個類模板之間的存儲分裂,而不是具有最派生類(SmallVector<T,N>)簡單地存儲所有N元素和指針傳遞給該存儲下來的基類?也就是說,在目前的默認構造函數:

SmallVector() : SmallVectorImpl<T>(N) { } 

一個假設的不同實現可以這樣做:

SmallVector() : SmallVectorImpl<T>(&Storage, T * sizeof(N)) { } 

SmallVectorTemplateCommon不會有FirstEl成員。目前實施的優勢是什麼?

+0

'SmallVector'並不總是很小,所以您需要一種方法來獲取獨立於'begin'的指向小存儲的指針。這可以通過'&firstEl'方便地獲得。 –

+0

@ T.C。你爲什麼需要它? – Barry

+0

如何判斷矢量是否處於沒有它的小模式(或一些等效信息)? –

回答

6

拆分存儲可避免在「大小擦除」類型SmallVectorImpl中存儲內聯容量(或「很小」位)。

SmallVectorImpl<T>可用於引用任何SmallVector<T, N>並支持所有向量操作。當底層存儲增長時,如果指針使用內聯容量,則不能傳遞給free。將當前存儲的地址與內聯容量的第一個元素進行比較很方便,並且可以在SmallVector中節省一些內存。