2012-11-19 20 views
30

Boş bir sınıfın boyutu 0 olamazsa, hangi magic std :: tuple yapıyor, böylece unique_ptr'nin boyutu 64 bitlik bir makinede 8 döndürüyor? _Dp deleter sınıfı olanstd :: unique_ptr'nin ek yükü nasıl olmaz?

typedef std::tuple<typename _Pointer::type, _Dp> __tuple_type;     
    __tuple_type _M_t; 

:

unique_ptr olarak elemanı olarak tanımlanır.

Derleyici tek şey ham bir işaretçi/taşıma kopyalama işlemini değiştirmek için uygulamak için gerekli için sıfır yükü olabilir belirtilen GCC versiyon 4.7.1 (Debian 4.7.1-7)

+2

Bu, uygulamaya bağımlı da olabilir, bu nedenle, hakkında konuştuğunuz derleyiciyi de dahil etmek isteyebilirsiniz. –

+5

Sorunuzdaki std :: tuple 'ile ilgili std :: unique_ptr ifadesinin nasıl olduğundan emin değilim. Açıklar mısınız? – Cameron

+2

@Cameron, _M_t, unique_ptr'deki temel tiptir. – piotr

cevap

43

Bunun nedeni, typename _Dp = default_delete<_Tp> boş bir sınıf ve tuple şablonunun boş bir temel sınıf optimizasyonu kullanmasıdır.

unique_ptr'u varsayılan olmayan bir silme ile başlatırsanız, boyut artışını görmelisiniz.

+10

Biraz yeniden ifade etmek için: kendi başına örneklendiğinde, bir sınıf sıfır olmayan bir boyuta sahip olmalı, ancak bir temel sınıf olarak uygulandığında sıfır boyutuna izin verilir. –

+0

İlgili: http://www.stroustrup.com/bs_faq2.html#sizeof-empty –

28

unique_ptr olduğu ; ek bilgi gerekli değildir. Bu nedenle unique_ptr işaretçinin yanı sıra bir şey depolamak gerekmez ve bir işaretçi ile aynı boyutta olabilir.

Uygulamanızın özelliğine göre; Sadece en türetilmiş türlerin sıfırdan büyük bir boyuta sahip olması gerekir. Boş temel sınıflar sıfır bayt alabilir. Standart kütüphane uygulamalarının, kapsayıcılarda bulunan vatansız paydaşlardan tuple kadar her tür şey için 'boş temel sınıf' optimizasyonundan faydalanması oldukça yaygındır.

+0

Cevabınız için teşekkür ederiz, +1 oyu aldım Daha az puan aldığı için chill'i kabul ettim ve geçerli bir cevap verdim. – piotr