[英]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>
? 這個問題的答案是:
T[n]
使用sizeof(T) * n
。 std::array<T, n>
使用與T[n]
相同的大小。 std::vector<T>(n)
需要一些控制數據(大小,容量以及可能並且可能是分配器)加上至少'n * sizeof(T)'個字節來表示其實際數據。 它可能會選擇也具有一個大於n
的capacity()
。 除了這些數字之外,實際上使用這些數據結構中的任何一個都可能需要附加的內存:
好的,我希望這能提供一些見識。 但是,這是一條重要信息:如果std::vector<T>
無法容納您擁有的數據量,則有兩種情況:
T[n]
或std::array<T, n>
的數據太多,將無濟於事,因為我們正在談論的開銷通常小於32個字節。 也許您可以描述您實際要做什么,以及為什么不能選擇std::vector<T>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.