亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

libc ++中短字符串優化的機制是什么?

libc ++中短字符串優化的機制是什么?

C++
楊__羊羊 2019-08-26 17:21:48
libc ++中短字符串優化的機制是什么?我想更詳細地了解它在實踐中是如何工作的,特別是在libc ++實現中:為了符合SSO資格,字符串有多短?這取決于目標架構嗎?在訪問字符串數據時,實現如何區分短字符串和長字符串?它m_size <= 16是一個簡單的,還是一個標志,是其他成員變量的一部分?(我想這m_size或其中的一部分也可能用于存儲字符串數據)。我專門針對libc ++問了這個問題,因為我知道它使用SSO,甚至在libc ++主頁上也提到過。以下是查看來源后的一些觀察結果:libc ++可以使用兩個稍微不同的字符串類內存布局進行編譯,這由_LIBCPP_ALTERNATE_STRING_LAYOUT標志控制。這兩種布局還區分了little-endian和big-endian機器,這些機器總共留下了4種不同的變體。我將在下面的內容中假設“正常”布局和小端。假設進一步size_type是4個字節并且value_type是1個字節,這就是字符串的前4個字節在內存中的樣子:// short string: (s)ize and 3 bytes of char (d)atasssssss0;dddddddd;dddddddd;dddddddd       ^- is_long = 0// long string: (c)apacityccccccc1;cccccccc;cccccccc;cccccccc       ^- is_long = 1由于短字符串的大小在高7位,因此在訪問它時需要移位:size_type __get_short_size() const {     return __r_.first().__s.__size_ >> 1;}類似地,長字符串容量的getter和setter用于__long_mask解決這個問題is_long。我仍在尋找我的第一個問題的答案,即__min_cap短字符串的容量對不同的架構有什么價值?
查看完整描述

2 回答

?
冉冉說

TA貢獻1877條經驗 獲得超1個贊


在libc中++實現有點復雜,我會忽略它的替代性設計,并假設小端計算機:


template <...>

class basic_string {

/* many many things */


    struct __long

    {

        size_type __cap_;

        size_type __size_;

        pointer   __data_;

    };


    enum {__short_mask = 0x01};

    enum {__long_mask  = 0x1ul};


    enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ?

                      (sizeof(__long) - 1)/sizeof(value_type) : 2};


    struct __short

    {

        union

        {

            unsigned char __size_;

            value_type __lx;

        };

        value_type __data_[__min_cap];

    };


    union __ulx{__long __lx; __short __lxx;};


    enum {__n_words = sizeof(__ulx) / sizeof(size_type)};


    struct __raw

    {

        size_type __words[__n_words];

    };


    struct __rep

    {

        union

        {

            __long  __l;

            __short __s;

            __raw   __r;

        };

    };


    __compressed_pair<__rep, allocator_type> __r_;

}; // basic_string

注意:__compressed_pair基本上是針對空基優化而優化的一對,又稱template <T1, T2> struct __compressed_pair: T1, T2 {};; 對于所有意圖和目的,你可以認為它是一個常規對。它的重要性剛剛出現,因為它std::allocator是無國籍的,因此是空的。


好的,這是相當原始的,所以讓我們檢查一下這些機制!在內部,許多函數將調用__get_pointer()自己調用__is_long以確定字符串是否使用__long或__short表示:


bool __is_long() const _NOEXCEPT

    { return bool(__r_.first().__s.__size_ & __short_mask); }


// __r_.first() -> __rep const&

//     .__s     -> __short const&

//     .__size_ -> unsigned char

說實話,我不太確定這是標準C ++(我知道最初的子序列規定,union但不知道它是如何與匿名聯合和別名一起拋出的),但是允許標準庫利用定義的實現無論如何。


查看完整回答
反對 回復 2019-08-26
  • 2 回答
  • 0 關注
  • 670 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號