假設我有一個分配器my_allocator
,當調用allocate(n)
時,它將始終爲n+x
(而不是n
)元素分配內存。使用內存超過std :: vector的末尾使用自定義的過分配分配器
我可以savely承擔的範圍內[data()+n, data()+n+x)
內存(對於std::vector<T, my_allocator<T>>
)可訪問/有效期爲進一步利用基本面的情況下(即放置新的或SIMD加載/存儲(只要沒有重新分配)?
注意:我知道過去data()+n-1
的所有內容都是未初始化的存儲空間。使用情況是使用自定義分配器的基本類型向量(無論如何都沒有構造函數),以避免在引發simd時出現特殊情況在向量處的內部函數my_allocator
應分配1)正確對齊的存儲,並具有2)大小爲所用寄存器大小的倍數。
爲了讓事情一點點清晰:
比方說,我有兩個向量,我想將它們添加:
std::vector<double, my_allocator<double>> a(n), b(n);
// fill them ...
auto c = a + b;
assert(c.size() == n);
如果從my_allocator
獲得的存儲現在分配對齊存儲和如果sizeof(double)*(n+x)
始終是所使用的SIMD寄存器大小的倍數(並因此是每個寄存器的值的倍數),我假設我可以做類似
for(size_t i=0u; i<(n+x); i+=y)
{ // where y is the number of doubles per register and and divisor of (n+x)
auto ma = _aligned_load(a.data() + i);
auto mb = _aligned_load(b.data() + i);
_aligned_store(c.data() + i, _simd_add(ma, mb));
}
其中我不必關心任何特殊情況,比如未對齊的加載或來自n
的未被y分割的積壓。
但是,矢量仍然只包含n
值,並且可以像大小爲n
的矢量一樣處理。
你爲什麼想要?如果您需要n + x空間,請將大小設置爲n + x。 –
@ChrisDodd:我需要尺寸爲'n'的矢量。我只想做一些循環展開,但不要確保不會超調(或者不必檢查是否還有任何未展開的方式需要處理)。 – Pixelchemist
剛剛使用'reserve'(在展開op之前,例如'reserve(n + x)'),而不是搞亂分配器,怎麼辦?如果你沒有在'size'之後存儲任何有用的東西,爲什麼'我<(n + x)'而不是簡單的'i
FranMowinckel