Std bağlamında kısaltma SSO anlamı::string
a C question about optimization and code style çeşitli yanıtlar "" std::string
. optimize kopya bağlamında SSO ' diye adlandırılan SSO bu bağlamda ne anlama geliyor?
Açıkça "tek oturum açma". "Paylaşılan string optimizasyonu", belki?
CEVAP
Arka Plan / Genel Bakış
İşlemleri otomatik değişkenler ("yığın" olan değişkenleri oluşturmak aramadan malloc
/ new
) genellikle çok daha hızlı ve birden içeren serbest depolama ("yığın", hangi değişkenler kullanılarak oluşturulur new
). Ancak, otomatik dizilerin boyutu derleme zamanında sabit, ama ÜCRETSİZ deposundan diziler boyutta değil. Ayrıca, boyutu sınırlıdır yığın (genellikle birkaç MiB), ücretsiz mağaza Eğer sistem belleği ile sınırlıdır oysa.
SSO Kısa / Küçük Dize Optimizasyonu. std::string
genelde ücretsiz depolamak için bir işaretçi olarak dize depolar (new char [size]
çağrı olsaydınız olarak benzer performans özelliklerini verir. "yığın"), Bu çok büyük dizeleri için yığın taşması, ama daha yavaş olabilir, özellikle kopyalama işlemleri ile engeller. Bir iyileştirme std::string
birçok uygulamaları küçük otomatik bir dizi char [20]
gibi bir şey oluşturmak. Eğer 20 karakter veya daha küçük (bu örnekte verilen, gerçek boyutu değişir) bir dize varsa, doğrudan bu dizi içinde saklar. Bu işleri biraz hızlandırmak için new
hiç ara ziyaret etmelisiniz.
DÃœZENLEME:
Ben böyle bir şeyi beklemiyordum cevap için çok popüler, ama bu yana, izin ver bir daha gerçekçi uygulama ile ihtar o hiç aslında okumak herhangi bir uygulama SSO "vahşi".
Uygulama ayrıntıları
En azından, std::string
aşağıdaki bilgileri saklamak gerekir:
- Boyutu
- Kapasitesi
- Veri konum
Boyutu son bir işaretçi olarak std::string::size_type
Bir ya da saklı olabilir. Tek fark kullanıcı size
çağırdığında iki işaretçiler çıkarmak veya kullanıcı end
çağırdığında bir işaretçi size_type
eklemek istediğiniz olup olmadığıdır. Kapasite olarak her iki şekilde de saklanabilir.
Kullanmadığın şey için para ödemiyorsunuz.
İlk olarak, saf uygulama yukarıda özetlenen neye dayanarak göz önünde bulundurun:
class string {
public:
// all 83 member functions
private:
std::unique_ptr<char[]> m_data;
size_type m_size;
size_type m_capacity;
std::array<char, 16> m_sso;
};
Bir 64-bit sistem, genellikle anlamına gelir std::string
24 bayt 'havai' başına dize, artı başka bir 16 TOA tampon (16 seçilmiş burada yerine 20 nedeniyle dolgu gereksinimleri). Gerçekten mantıklı karakter yerel bir dizi ARTI bu üç veri üyeleri saklamak için, basitleştirilmiş benim örnekte olduğu gibi olmayacaktı. m_size <= 16
m_sso
, ben zaten kapasitesini biliyor ve veri göstericisi gerek yok bu yüzden tüm verileri koyacağız. m_size > 16
, sonra m_sso
ihtiyacım yok. Hepsini ben gereken yere üst üste kesinlikle yoktur. Boşluk boşa akıllı bir çözüm biraz daha bu (denenmemiş, yalnızca örnek amaçlı) gibi görünecektir:
class string {
public:
// all 83 member functions
private:
size_type m_size;
union {
class {
// This is probably better designed as an array-like class
std::unique_ptr<char[]> m_data;
size_type m_capacity;
} m_large;
std::array<char, sizeof(m_large)> m_small;
};
};
Çoğu uygulamaları bu gibi kabul ediyorum.
C açık kelime anlamı nedir?...
JavaScript, basit bir beÅŸgen kullanmak...
JavaScript string Trim?...
Python katılın, neden dize.liste yerin...
JavaScript string özellik değeri nesne...