2009-03-17 17 views
7

Bir proje için bazı STL konteynırlarını sıfırdan yazıyorum (nedenlerim var). STL'nin işlevselliğini ve arayüzlerini bu kadar yakından taklit ettiğim için, politikaya uymak için elimden gelenin en iyisini yapıyorum "eğer standart bir yapıyla aynı isme sahipse, mümkün olduğunca standarda uyacaktır."std :: allocator yapı/yoklama vs. yerleştirme yeni/p-> ~ T()

Tabii ki, kaplarım, ayırıcıları bazı özel ayırma düzenlerine izin verdiği için çok güzel olan şablon parametresi olarak alır. Soruma göre.

std::allocator arabirimi, bellek yapılandırmasını nesne yapısından ayırır. Aynı şekilde tahsisatı tahripten ayırır. Bu, mantıklı olduğunuz yerden C++ 'da bir nesneyi düzgün bir şekilde inşa etmek için az çok ilgisiz olduğu için mantıklıdır. sadece yeni yerleşim çağırır

void construct(pointer p, const T& val) { new(p) T(val); } 
void destroy(pointer p)     { p->~T(); } 

sen inşa gördüğünüz gibi ve sadece yıkıcı çağırır yok:

Yani (bir kitap düz kaldırılmış) varsayılan uygulanması için şuna benzer iki yapı/deallocation fonksiyonları .

Yalnızca yeni ve yıkıcı sözdizimini kullanarak bunları kullanmak için herhangi bir neden var mı? Bir "doğru" ayırıcı, bunları başka bir şekilde uygulayabilir mi? Yoksa standarda uygun olan bütün ayırma uygulamalarının bu şekilde uygulanan yöntemleri imha edecek mi/yok edeceklerini garanti ediyorum mu?

Noktalarım, kaplarımın öğelerini oluşturmak için her zaman std::uninitialized_copy ve std::uninitialized_fill'u kullanabileceğimi söylemek güvenli midir?

Teşekkürler.

cevap

8

Adanan, yapım/imha işlemlerinden önce ve sonra veya yapmaya özen gösterdiği diğer yan etkiler için günlük ekleyebilir. Tabii

fiili inşaat yeni bir yerleşim ve yıkıcı arayarak oluşmaya var, ama ben kabul edebilirim başkaşey/işlevlerini

+1

evet, bu iyi bir nokta, bu "tahsis sonrası/inşaat öncesi" kayıt veya memleak takibi için iyi bir kanca olabilir. –

+1

Bu cevap doğru ama biraz yanıltıcı. Günlüğe kaydetme gibi yan etkiler, doğru istisna güvenliği ile yapmak için oldukça zordur. Daha sık özelleştirme, gömülü yeni ifadeye, ör. kurucu argümanları. Bkz. Https://groups.google.com/a/isocpp.org/d/topic/std-discussion/yZLnYy_y2z0/discussion – Potatoswatter

2

Bu, bir yöntemdeki ayırma ayrıntılarını gizlemek içindir. Yani, biz inşaat ve imha için API'leri sağlıyoruz, gelecekte uygulamayı değiştirebiliriz. Şimdi, belleği ayırmak için yeni yerleşimi kullanıyoruz, gelecekte bu iki yöntemi değiştirmek zorunda olduğumuz tahsisi değiştirmek istiyorsak gelecekte.

+0

yea yok yapı olması gerektiğini dikkate kural kitabında demiyor Bununla. Ama standardın değişmesine izin verip vermediğini merak ediyorum. (Özellikle, yeni bir std için beklemek zorunda kalmayan özel ayırıcılar ile ...). –

+0

'allocator :: yapmanın, tahsis ile ilgili hiçbir ilgisi yoktur ve tüm ayıraçlar (şimdi) tahsis ettikleri için, neden inşa etmenin başka bir şey yaptığını hayal edemiyorum –

İlgili konular