簡體   English   中英

std :: array,std :: vector和raw數組的大小

[英]Size of std::array, std::vector and raw array

讓我們擁有

std::array <int,5> STDarr;
std::vector <int> VEC(5);
int RAWarr[5];

我試圖把它們的大小

std::cout << sizeof(STDarr) + sizeof(int) * STDarr.max_size() << std::endl;
std::cout << sizeof(VEC) + sizeof(int) * VEC.capacity() << std::endl;
std::cout << sizeof(RAWarr) << std::endl;

輸出是

40
20
40

這些計算正確嗎? 考慮到我沒有足夠的內存來存儲std::vector ,也沒有逃避動態分配的方式,該怎么辦? 如果我知道std::array導致較低的內存需求,那么我可以更改程序以使數組成為靜態。

這些數字是錯誤的。 而且,我也不認為它們代表了您所認為的。 讓我解釋。

首先,關於他們錯的部分。 不幸的是,您沒有顯示sizeof(int)的值,因此我們必須導出它。 在您使用的系統上,可以將int的大小計算為

size_t sizeof_int = sizeof(RAWarr) / 5; // => sizeof(int) == 8

因為這實際上是sizeof(T)的定義:它是數組中兩個相鄰的類型T對象的開始之間的字節數。 這恰好與STDarr的數字打印不一致 :類模板std::array<T, n>被指定為其中嵌入了n個類型為T對象的數組。 此外, std::array<T, n>::max_size()是一個常數表達式,產生n 也就是說,我們有:

40                                               // is identical to
sizeof(STDarr) + sizeof(int) * STDarr.max_size() // is bigger or equal to
sizeof(RAWarr) + sizeof_int * 5                  // is identical to
40             + 40                              // is identical to
80

那就是40 >= 80一個矛盾。

同樣,第二次計算也與第三次計算不一致: std::vector<int>至少包含5元素,並且capacity()必須大於size() 此外, std::vector<int>的大小不為零。 也就是說,必須始終滿足以下條件:

sizeof(RAWarr) < sizeof(VEC) + sizeof(int) * VEC.capacity()

無論如何,所有這些都與您實際的問題似乎無關:使用內置的T數組, std::array<T, n>和an來表示n個類型為T對象的開銷是多少? std::vector<T> 這個問題的答案是:

  1. 內置數組T[n]使用sizeof(T) * n
  2. std::array<T, n>使用與T[n]相同的大小。
  3. 一個std::vector<T>(n)需要一些控制數據(大小,容量以及可能並且可能是分配器)加上至少'n * sizeof(T)'個字節來表示其實際數據。 它可能會選擇也具有一個大於ncapacity()

除了這些數字之外,實際上使用這些數據結構中的任何一個都可能需要附加的內存:

  1. 所有對象都在適當的地址對齊。 為此,對象前面可能有一個額外的字節。
  2. 當在堆上分配對象時,內存管理系統除了可以使用的內存外,還包括幾個字節。 這可能只是大小的一個字,但無論分配機制如何,它都可以。 同樣,此內存可能位於分配內存之外的其他位置,例如,在哈希表中。

好的,我希望這能提供一些見識。 但是,這是一條重要信息:如果std::vector<T>無法容納您擁有的數據量,則有兩種情況:

  1. 您的內存極低,因此大部分討論都是徒勞的,因為您需要完全不同的方法來處理幾個字節。 如果您在資源極其有限的嵌入式系統上工作,就會是這種情況。
  2. 使用T[n]std::array<T, n>的數據太多,將無濟於事,因為我們正在談論的開銷通常小於32個字節。

也許您可以描述您實際要做什么,以及為什么不能選擇std::vector<T>

暫無
暫無

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

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