2015-07-30 19 views
8

Bitişik bellekte, farklı ancak bilinen ve makul boyutta küçük boyutlarda, her biri std::vectors'u saklamanın bir yolunu bulmak istiyorum. Kendi sınıfımı yazabileceğimin farkına vardım, çok geniş bir diziyle ve dizinin her bir alt bölümünün başlangıcı için ayrı bir varlık gibi ele alınan daha büyük bir dizinin başlangıcına işaret edebilirim, fakat bunun daha akıllı bir yolu olması gerektiği anlaşılıyor. .Birkaç küçük std :: vektörü için bitişik bellek ayırma?

Örneğin, bitişik std::vectors oluşturmak için allocators kullanmanın bir yolu var mı? Tekerleği yeniden icat etmemek istiyorum, çünkü bu normalde normalde bu bellek lokalitesini istiyorum std::vectors

Kodlamaya nasıl başlayacağımı bilmiyorum. Hafızada bir işaretçi alan, oradaki bir vektörü tahsis eden ve sonra bir şekilde bu vektörün sonunun adresini geri alan bir ayırıcı yaratmam gerekiyor, böylece bir sonraki std::vector 'un ayırıcısı bunu alıp tekrar yapabilir. allocator bir değeri nasıl döndürür?

+2

Evet, bunu yapmak için ayırıcıları kullanabilirsiniz. Ne denedin? Çalıştığını göster :) – Andrew

+0

@Andrew Soruma bir şey ekledim ama nereden başlayacağımı bilmiyorum. Allocators ile çalışmadım ve şimdiye kadar yaptığım her şey STL referansında Josuttis'in bölümlerini okudu. – sunny

+1

Herhangi bir ihtimalle, derleme zamanında bilinen boyutlarda mıdır? – dasblinkenlight

cevap

1

Çözüm, HowardHinnant'ın short_alloc. Yığın üzerinde tahsis etmek istiyorum yani new, *** kullanmak zorundayım ama aksi halde Howard'ın gönderdiği kod tam olarak istediğimi yapıyor.

template <std::size_t N> 
class arena 
{... 
char* buf_ = new char[N] 
// still need to align this but not sure of the syntax 
// to do that with a new statement 
... 

benim açımdan eksik parça ben soru allocators bağımsız değişken alır constructors olabileceğini sordum: Questions about Hinnant's stack allocator den başvuruldu: Başka SO sonrası kod referans buldum

constexpr int N = 1000*sizeof(int); 
arena<N> myArena; 
std::vector<int, short_alloc<int, N>> x(MyArena); 

CodeReview sonrası Chris Drew, yukarıdaki yorumunda önerdi. Hepinize teşekkür ederim.

*** kodu (* o buf_ ilanından itibaren göründüğü gibi) veya öbek üzerinde bu stack üzerinde olup olmadığından emin beni bırakarak, allocate yöntemde new kullanmak yapar (new kullanılması) ...

0

Gereksiniminiz için, std :: allocator ve geçersiz kılmaları genişleten özel ayırıcıyı, bellek havuzundan parçaları toplayan ayırma yöntemini ayırırdım. Gereken maksimum boyutu zaten biliyorsanız, bellek havuzu boyutunu seçmek bir sorun olmamalıdır.

+0

Evet, katılıyorum, bu benim asıl soruda belirttiğim stratejidir, fakat onu bir ayırıcı ile nasıl yürüteceğimi açıklamamıştım. Aşağıda yayınladığım çözüm istediğimi yapar. – sunny

+0

Yığına tahsis etmek istiyorsanız, dahili alloca ile hafızaya göz atın. Özel ayırıcınız, bellek havuzunu nereden alacağınız konusunda seçime sahiptir. Umarım yardımcı olur. Bu yığın üzerinde tahsis edildiğinden, iade üzerine otomatik olarak atılır. – kchoi

İlgili konular