SORU
25 NİSAN 2012, ÇARŞAMBA


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
25 NİSAN 2012, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 8lacKy

    8lacKy

    30 Mart 2009
  • Influencer Plus

    Influencer P

    2 Ocak 2013
  • TotalxLuna

    TotalxLuna

    27 Kasım 2011