簡體   English   中英

C ++小字符串優化(SSO)如何與容器一起使用?

[英]How could C++ Small String Optimized (SSO) work with containers?

SSO解釋說,小字符串分配在堆上:是的,但是當在容器內部構造時,這些內容不應放在堆棧上,因為容器可以在函數中創建並返回,而函數堆棧會過時。

所以我想SSO不能與STL容器一起使用,對嗎?

“小字符串”和“大字符串”之間的區別不是將其存儲在堆棧或堆上的區別。 取而代之的是間接級別

這意味着std::string對象可以保存指向實際字符串數據的指針,該指針可以(幾乎)任何長度,但是具有間接動態內存的所有缺點-分配,釋放,緩存未命中等。

另外,SSO允許std::string將小字符串“就地”存儲在std::string對象內部,無論它在哪里分配。 如果對象位於字符串所在的某個容器中(在堆中),但是不需要像大字符串那樣的其他間接調用。

讓我們用vectorstring舉例。

  1. 參見我對“ c ++ Vector,當它在堆棧上擴展/重新分配時會發生什么?”的回答。 看看vector通常“看起來”是什么。

  2. 如果將string s存儲在vector ,則所有string實例將在堆上。

  3. 字符串實例本身可以

    • 將字符串數據本身包含在對象實例(SSO)中或
    • 在堆上分配內存以存儲內容。
  4. vector類不在乎string類將數據存儲在何處。 它只包含自己管理數據的對象。

SSO不會影響在容器中存儲string

PS:您當然可以從函數返回堆棧對象。 函數堆棧將“超出范圍”,但保留返回值。 否則,您甚至無法返回int

SSO並不意味着無論如何string內容都在堆棧上。 這僅表示(小字符串的)數據存儲在string實例中。 因此,如果實例在堆棧上,則數據在堆棧上。 如果對象在堆上,那么數據也在堆上。

您當然可以編寫一個類似於矢量的類,該類具有“小對象優化”,如果對象很小且很少,它將在內部(容器對象本身內部)存儲它們,否則將它們存儲在堆中(例如std::vector現在開始)。

但是,由於對它們的要求,當前對於標准庫中的容器而言這是不可能的。 特別是[container.requirements.general] / 9說:

在交換之前,每個迭代器在一個容器中引用一個元素,在交換之后,每個迭代器應在另一個容器中引用相同的元素。

小對象優化很難做到這一點,並且該要求不適用於basic_string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM