2017-01-26 29 views
13

Rasgele büyük nesneleri tutmak için, boost::any/std::any kesinlikle nesneler için yığın alanı ayırmaya ihtiyaç duyar. Bununla birlikte, boyutu bir işaretçiye (int,char,bool,...) daha az veya eşit olan küçük türler için, any, bunun yerine değeri yerinde veya başka bir yerinde bellekte saklayabilir ve yığın alanını ayırmaz. Ama uygulama bunu yapıyor mu?Boost :: any/std :: herhangi bir mağazada küçük nesneler var mı?

any'da küçük türleri depoladığım ve bazen yalnızca string s gibi daha büyük türlerde sakladığım bir senaryo var. Kod oldukça sıcak ve bu yüzden soruyu soruyorum. Optimizasyon yapılmazsa, küçük türleri yerinde depolayan kendi uygulamasından daha iyi olabilirim.

+1

"kod parçası olacak kadar küçük bir şablon yapma uygulanması maliyetidir oldukça sıcak"? İyi performans göstermediğini mi kastediyorsun? Optimizasyonları derlediniz mi? Bu ekstra bellek erişiminin oyunun performans değiştiricisi olduğundan şüpheleniyorum. – mascoj

+0

['libC++' trunk] (https://github.com/llvm-mirror/libcxx/blob/master/include/any) [küçük nesne] var (https://github.com/llvm-mirror/libcxx/ std :: any' için blob/master/include/any # L132) optimizasyonu. Herhangi bir makul STL uygulaması için aynı olması gerektiğinden şüpheleniyorum ... – WhiZTiM

+0

@mascoj "hot code", geri kalanından önemli ölçüde daha sık yürütülen bir kod kısmıdır ve bu nedenle bir darboğaz haline gelmeye en yatkındır. – Quentin

cevap

11

küçük içerdiği nesne için dinamik olarak ayrılan bellek kullanımını önlemek gerekir [any.class]

o Uygulamaları hiçbir garanti ama C++ 17 taslak devletler vardır. [Örnek: oluşturulan nesnenin yalnızca bir int tuttuğu yer. - Son örnek) Bu gibi küçük nesne optimizasyonu, is_­nothrow_­move_­constructible_­v<T>'un true olduğu T türlerine uygulanacaktır.

Ne yazık ki bir int yerde saklanmalıdır gerekir söylemek dışında küçük düşünülmelidir şey için bir öneri vermez.

+2

Maksimum boyut bir şablon parametresi olarak tanımlanmış olsaydı hoş olurdu (şimdi ne olursa olsun varsayılan değeri ile) –

+0

@ViktorSehr Bu harika olurdu. – NathanOliver

+5

@NathanOliver Gerçekten değil. Herhangi bir '<16>' ile herhangi bir '' '' 'n çoğalması, herhangi bir <42>' türünden farklı bir tür olması, bu tür kelime türlerine sahip olmanın amacının yarısını yener. –

5

Boost.Any kaynak kodunu doğru bir şekilde anlar ve bir hata ayıklayıcısında poking işleminden küçük bir nesne en iyileştirme uygulanmaz. (Yeni kayıtsız şartsız kullanımına dikkat edin.)

template<typename ValueType> 
    any(const ValueType & value) 
     : content(new holder< 
      BOOST_DEDUCED_TYPENAME remove_cv<BOOST_DEDUCED_TYPENAME decay<const ValueType>::type>::type 
     >(value)) 
    { 
    } 
2

Nathan Oliver ve Josh'un Kelley yanıtlarınız doğru: garantisi yoktur, boost küçük değer optimizasyonu kullanmaz. Daha pratik durumlarda

, https://github.com/llvm-mirror/libcxx/blob/master/include/experimental/any#L129 gösterir Eğer libC++ (çınlama en) (onlar 8 bayt genişliğinde olup olmadığını 24 bayt) size uzayın 3 geçersiz işaretçileri değerinde verir

libstdC++ tek işaretçi: https://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/include/experimental/any?view=markup#l106

Boyutu bir şablon parametresi yapmak için any değiştirmek zor değil, aynı zamanda farklı boyutlarda any arasında dönüştürülebilirlik olduğundan emin olmalısınız.

IMO, performans farkı benim ölçütler çerçevesinde, tahsis küçük boyutlu optimizasyon ve yığın arasındaki bu yüzden önemli olduğunu ve bunun standart

+1

En azından C++ 17 standardında değil, standartta bir şablon olacağını düşünmüyorum. Standart zaten tamamlanmış özelliktedir. – gexicide

İlgili konular