std::streambuf*
alan bir istek yöntemiyle bir ağ istemcim var. Bu yöntem, boost::iostreams::copy
tarafından, verileri bir ağ API'sine nasıl yazılacağını bilen, özel bir std::streambuf
türetilmiş sınıf tarafından uygulanmaktadır. Bu, bir dosyayı belleğe okumaya gerek kalmadan istek üzerine aktarabilirim anlamına gelir. Ancak, bir dosyada olmayan büyük veri bloklarının gönderilmesi gereken bazı durumlar vardır, bu yüzden bir dizge içeren bir aşırı yük dahil ettim. Akıştaki tüm ağ kodlarını çoğaltmaktan kaçınmak için, dizeyi temsil eden bir streambuf
kurmalı ve diğer yöntemi çağırmalıyım.Std :: string'ten bir kopyasını oluşturmadan akış?
std::istringstream ss(data);
send(ss.rdbuf());
Maalesef istringstream
bazı durumlarda birkaç megabayt olan verilerin, bir kopyasını yapar: Ben bu işi yapmak için anlamaya tek yolu gibi bir şey oldu. Genel durumda mükemmel bir anlam ifade eder, tabii ki, eğer bir nesneye bir referans gönderirseniz, o nesneyi o referansı kullanmaya devam edeceğini varsaymak istemezsiniz.
struct zerocopy_istringbuf
: public std::stringbuf
{
zerocopy_istringbuf(std::string const* s)
: std::stringbuf(std::ios::in)
{
char* p = const_cast<char*>(s->c_str());
setg(p, p, p + s->length());
}
};
...
send(&zerocopy_istringbuf(data));
Bu sadece iyi iş gibi görünüyor, ama bu gerçekten gerekli mi acaba:
aşağıdaki ile bu çalıştı. std::istringstream
neden std::string const *
numaralı telefonu kullanıyor? Bunu yapmanın daha iyi bir yolu var mı?
ilginç bir fikir. Mevcut kurulumla ilgili hoşuma giden şeylerden biri, std :: stringbuf'dan türeterek özel bir girdi veya çıktı akışı oluşturabilmem ve sadece bir veya iki basit işlevi, alt akışı veya "taşma" ve sync', temel sınıf benim için tüm tampon yönetimini yönetir. Sanırım şeyleri std :: vector'ya dayandırmak çok daha fazla koda ihtiyacım var demektir. Yine de "swap" ı kullanabiliyordum, ancak arayanın sabit bir referansta geçmekten ziyade "pes etmesini" istiyorum. –