2009-12-21 37 views
16

Uygulamamda dizeleri ve hata iletilerini oluşturmak için kapsamlı olarak std::stringstream kullanıyorum. stringstreams genellikle çok kısa ömürlü otomatik değişkenlerdir.Std :: stringstream önyükleme yapmalı mıyım?

Böyle bir kullanım, her değişken için yığın yeniden tahsisine neden olur mu? Geçici olarak sınıf üyesi stringstream değişkenine geçmeli miyim?

İkinci durumda, stringstream arabelleği nasıl yedekleyebilirim? (Yeterince büyük bir dizeyle başlatmalı mıyım yoksa daha zarif bir yöntem mi olmalıyım?)

cevap

11

Yürütülüğünüzü belirlediniz ve yavaşlama kaynağı olarak gördünüz mü?

Kullanımlarını dikkate alın. Çoğunlukla kodunuzun normal akışı dışındaki hata mesajları için mi? herhangi bir tahsis stringstream için gerçekleşmeden önce

Bildiğim kadarıyla yeri ayrılması olarak ...

Bazı uygulamalar muhtemelen küçük bir tampon saklıdır. Std :: string'in birçok uygulaması bunu yapar.

Diğer bir seçenek (denenmemiş!) Olabilir

std::string str; 
str.reserve(50); 
std::stringstream sstr(str); 

Bu gamedev thread biraz daha fikir bulabilir.

düzenleme:

stringstream's rdbuf etrafında nakledilme da bir çözüm olabilir. Bu yaklaşım muhtemelen Yanlış Olmak Üzere Çok Kolaydır, bu yüzden lütfen be sure it's absolutely necessary. Kesinlikle zarif veya özlü değil.

+0

İyi tavsiyeler; bununla birlikte, 50'yi rezerve etmek ve daha sonra bu diziyi kopyalamak, küçük bir yığın olmayan arabellek en iyileştirmesini (uygulamanızın bir tane varsa) yenebilir. Kendi streambuf'unuzu yazmak istiyorsanız, tüm buffer yönetimi üzerinde kesin kontrolünüz var; daha sonra rdbuf aracılığıyla bir stringstream'in arabelleğini değiştirmek yerine akım akışınızı (ya da akış yönünü veya iostream'i kullanırsınız, ancak soru çıkış biçimlendirmesini gösterir.) –

+6

Dize akışı, str'nin içerik uzunluğundan (0) daha fazla bir şey ayırmadığını düşünmüyorum. Cplusplus.com'a göre: "İçerik olarak str'nin bir kopyasına sahip bir ostringstream nesnesi oluşturur." Referans, "dize içeriğinin kopyası". Açıkça, aynı miktarda belleği ayırdığını söylemez. Bu yapıcıyı kullanarak bellek ayırma hakkında herhangi bir şey söyleyen herhangi bir kaynak bulamadım. – NickSoft

+0

Yukarıda kullandığınız kurucu artık geçerli değil. Kopya olmayan kurucunun kaldırıldığını görebilirsiniz. http://www.cplusplus.com/reference/sstream/stringstream/stringstream/ – user1122069

1

Emin değilim, ancakstringstream'un string sonucuyla sıkıca ilişkili olduğundan şüpheleniyorum. Bu yüzden, ss.seekp(reserved-1); ss.put('\0');'ustringss'un içinde bayt olarak ayırabileceğinizden şüpheleniyorum. Aslında ss.seekp(reserved); ss.trunc(); gibi bir şey görmek istiyorum, ancak akışlar için trunc() yöntem yoktur.

İlgili konular