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

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

STD:String上下文中首字母縮略詞SSO的含義

STD:String上下文中首字母縮略詞SSO的含義

C++ C
小唯快跑啊 2019-06-20 15:27:23
STD:String上下文中首字母縮略詞SSO的含義在……里面一個關于優化和代碼風格的C+問題,在優化副本的上下文中引用了“SSO”的幾個答案。std::string..在這種情況下,SSO是什么意思?顯然不是“單點登錄”?!肮蚕碜址畠灮保苍S?
查看完整描述

3 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

背景/概況

對自動變量(“來自堆?!?的操作,這些變量是無需調用而創建的變量。malloc / new)通常比涉及空閑存儲(“堆”)的速度快得多,后者是使用new)。然而,自動數組的大小在編譯時是固定的,但是來自空閑存儲的數組的大小則不是。此外,堆棧大小是有限的(通常是少數MIB),而空閑存儲僅受系統內存的限制。

SSO是短/小字符串優化。一個std::string通常將字符串存儲為指向空閑存儲的指針(“堆”),它提供類似的性能特征,就像要調用new char [size]..這可以防止非常大的字符串發生堆棧溢出,但速度可能會更慢,特別是對復制操作而言。作為一種優化,許多實現的std::string創建一個小的自動數組,類似于char [20]..如果您的字符串為20個或更小的字符(給定此示例,實際大小不同),則它將直接存儲在該數組中。這就避免了調用new這會讓事情變得更快一些。

編輯:

我沒想到這個答案會如此流行,但既然如此,讓我給出一個更現實的實現,但請注意,我從來沒有真正讀過任何SSO的實現“在野外”。

實施細節

至少,std::string需要存儲以下信息:

  • 大小
  • 容量
  • 數據的位置

大小可以存儲為std::string::size_type或者是指向終點的指針。唯一的區別是用戶調用時是否需要減去兩個指針。size或者添加一個size_type當用戶調用時指向指針。end..容量也可以任意存儲。

你不用付錢。

首先,考慮基于以上概述的天真實現:

class string {public:
    // all 83 member functionsprivate:
    std::unique_ptr<char[]> m_data;
    size_type m_size;
    size_type m_capacity;
    std::array<char, 16> m_sso;};

對于64位系統,這通常意味著std::string每個字符串有24字節的“開銷”,另外還有16字節用于SSO緩沖區(此處選擇16字節,而不是由于填充要求而選擇20字節)。在我的簡化示例中,存儲這三個數據成員加上一個本地字符數組是沒有意義的。如果m_size <= 16,然后我會把所有的數據都放進m_sso,所以我已經知道了容量,并且不需要指向數據的指針。如果m_size > 16,那我就不需要m_sso..在我需要它們的地方絕對沒有重疊之處。一個不會浪費任何空間的更聰明的解決方案看起來會更像這樣(未經測試,僅用于示例目的):

class string {public:
    // all 83 member functionsprivate:
    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;
    };};

我假設大多數實現都是這樣的。


查看完整回答
反對 回復 2019-06-20
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

SSO是“小字符串優化”的縮寫,這種技術將小字符串嵌入到String類的主體中,而不是使用單獨分配的緩沖區。


查看完整回答
反對 回復 2019-06-20
  • 3 回答
  • 0 關注
  • 678 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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