2009-10-12 23 views
2

如何預測矢量的大小?有沒有辦法通過單獨的類型獲取矢量的字節大小?

#include <vector> 
#include <iostream> 
using namespace std; 

int main() { 
    cout << sizeof(vector<char[8]>) << endl; 
    cout << sizeof(vector<char[16]>) << endl; 
    return 0; 
} 

[[email protected] LCDControl]$ ./test 
12 
12 
+0

預測大小是什麼意思?在你的例子中它看起來非常可預測 - 12個字節。請記住,這是依賴於實現的。 – 2009-10-12 19:01:49

回答

12

由於vector<>本身是一個自己動態內存管理的類,使用sizeof運算符來詢問它的大小並不是非常有意義。我懷疑你會發現上面計算的值總是12.

可以使用.size()方法向矢量詢問它包含的元素的數量。此外,.capacity()方法會告訴你它有多少元素實際上爲分配了內存(即使它們尚未被全部使用)。

請記住,sizeof編譯評估時,所以它不知道有多少元素後來在運行時插入到容器中。

1

有一種方法叫大小()
這告訴你有多少元素都包含內部。
但是,對象的大小不會反映這一點,因爲它只包含一個指向實際數據的指針。

順便說一句,你正在聲明char數組的向量。 這是你真正想要的嗎?

而且這樣的:

std::cout << std::vector<X>(Y) << "\n"; 

應(proobably)總是返回相同的值不是無論什麼X或Y爲。

0

你想要做什麼,你想知道有多少內存std::vector包含8或16 char s佔用?

如果這就是你想要的,你上面的代碼是錯誤的。上面的代碼顯示的是std::vector的大小,其中元素是char s的數組。它爲您提供了對象本身的大小 - 但沒有說明元素佔用的內存量。該內存由vector動態分配。

這是不可能的sizeof運營商知道這一點,因爲sizeof是一個編譯時操作,而對於元素的內存在運行時動態分配。

+0

嗯,是的,我知道這是錯的。這與我能想出的實際「正確方式」差不多。我希望「正確的方式」,因此這個問題。 – Scott 2009-10-12 19:04:14

+0

正確的做法是什麼?你想做的事情沒有意義。也許告訴我們你想做什麼,這讓你覺得你需要知道尺寸。 – 2009-10-12 19:05:23

+0

嗯,我有一個向量,我想memset它爲0.也許我應該只使用char [8] [8]而不是根據需要重新分配? – Scott 2009-10-12 19:08:26

3

sizeof始終返回第一級對象/類型的大小。它不會嘗試測量對象指向其他位置的內存量。 sizeof返回的12個字節反映了vector的數據成員的大小。其中一位成員是指向實際數據的指針。

0

其他回答解釋了爲什麼您不能像您嘗試的那樣直接使用sizeof。但是,您可以使用sizeof來獲得你在找什麼下列方式:

vector<int> my_vector; 

// Push some stuff here 
// ... 

cout << my_vector.size() * sizeof(int) << endl; 

my_vector.size()將返回大小中的元素。然後使用sizeof(element)來獲取數組中每個元素的字節大小。他們的產品是您正在尋找的答案。

相關問題