[英]How could C++ Small String Optimized (SSO) work with containers?
SSO解釋說,小字符串分配在堆上:是的,但是當在容器內部構造時,這些內容不應放在堆棧上,因為容器可以在函數中創建並返回,而函數堆棧會過時。
所以我想SSO不能與STL容器一起使用,對嗎?
“小字符串”和“大字符串”之間的區別不是將其存儲在堆棧或堆上的區別。 取而代之的是間接級別 。
這意味着std::string
對象可以保存指向實際字符串數據的指針,該指針可以(幾乎)任何長度,但是具有間接動態內存的所有缺點-分配,釋放,緩存未命中等。
另外,SSO允許std::string
將小字符串“就地”存儲在std::string
對象內部,無論它在哪里分配。 如果對象位於字符串所在的某個容器中(在堆中),但是不需要像大字符串那樣的其他間接調用。
讓我們用vector
和string
舉例。
參見我對“ c ++ Vector,當它在堆棧上擴展/重新分配時會發生什么?”的回答。 看看vector
通常“看起來”是什么。
如果將string
s存儲在vector
,則所有string
實例將在堆上。
字符串實例本身可以
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.