簡體   English   中英

GCC中的std :: string實現及其短字符串的內存開銷

[英]std::string implementation in GCC and its memory overhead for short strings

我目前正在開發一個低內存平台的應用程序,它需要一個std :: set的許多短字符串(> 100,000個字符串,每個字符串4-16個字符)。 我最近將這個集合從std :: string轉換為const char *以節省內存,我想知道我是否真的避免了每個字符串的所有開銷。

我嘗試使用以下內容:

std::string sizeTest = "testString";
std::cout << sizeof(sizeTest) << " bytes";

但它只給了我一個4字節的輸出,表明該字符串包含一個指針。 我很清楚字符串在內部將它們的數據存儲在char *中,但我認為字符串類會有額外的開銷。

std :: string的GCC實現是否比sizeof(std :: string)指示的更多開銷? 更重要的是,這個數據集的重要性是否顯着?

以下是我平台上相關類型的大小(它是32位,每字節有8位):

char:1個字節
void *:4個字節
char *:4個字節
std :: string:4個字節

好吧,至少GCC 4.4.5,這是我在這台機器上的便利, std::stringstd::basic_string<char>的typdef,而basic_string是在/usr/include/c++/4.4.5/bits/basic_string.h定義的/usr/include/c++/4.4.5/bits/basic_string.h 該文件中有很多間接,但它歸結為非空std::string存儲指向其中一個的指針:

  struct _Rep_base
  {
size_type       _M_length;
size_type       _M_capacity;
_Atomic_word        _M_refcount;
  };

在實際的字符串數據中跟隨內存。 所以std::string對於每個字符串至少要有三個字的開銷,加上capacity高於`length任何開銷(可能不是,取決於你如何構造字符串 - 你可以通過詢問capacity()來檢查capacity()方法)。

你的內存分配器也會有大量的小額分配開銷; 我不知道GCC對C ++使用什么,但假設它類似於它用於C的dlmalloc分配器,每個分配至少可以有兩個字,加上一些空間可以將大小與至少8個字節的倍數對齊。

我猜你是在32位,每字節8位平台上。 我還要猜測,至少在您使用的gcc版本上,他們正在使用std :: string的引用計數實現。 您看到的4字節大小是指向包含引用計數和字符串數據(以及任何分配器狀態,如果適用)的結構的指針。

在這個gcc的設計中,唯一的“短”字符串的大小為== 0,在這種情況下,它可以與其他每個空字符串共享一個表示。 否則,您將獲得一個refcounted COW字符串。

要自己調查一下,編寫一個分配器來跟蹤它分配和釋放多少內存,以及多少次。 使用此分配器來調查您感興趣的容器的實現。

如果它保證“> 100,000個字符串,每個4-16個字符”,那么不要使用std :: string。 相反,編寫自己的ShortString類。 有趣的是“sizeof(std :: string)== 4”,這怎么可能? 什么是sizeof(char)和sizeof(void *)?

我已經對std :: string開銷進行了一些比較。 一般來說它大約是48個字節! 看看我博客上的文章: http//jovislab.com/blog/?p = 76

暫無
暫無

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

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