2010-08-13 43 views
4

假設我有一個類如何通過引用獲取對象的大小?

class Foo { 

: 
: 

} 

我有另一個功能

void getf(Foo &f) { 

: 
: 

std::cout<<sizeof f<<std::endl; 
} 

予處理數據和分配大量的數據至f(包含在富成員向量)後,我需要的大小f對象

但是,正如我在上面所做的那樣,我總是得到16,這是參考的大小。

我做錯了什麼?怎麼做?

謝謝!

+1

自從我做了C++之後已經有一段時間了 - 但不是'sizeof * f'嗎? – ChrisF 2010-08-13 14:28:38

+3

f是一個不是指針的引用,對吧? – skydoor 2010-08-13 14:29:23

+1

嗯......你的參考文獻是16字節長?大部分我看起來都是4.您的機器可以提供多少內存? – 2010-08-13 14:32:00

回答

8

sizeof返回類型的大小。通常,在Vector的情況下,類型的大小不一定包括該類型可指向的所有內容的累積大小。例如,鍵入:

class Foo { 
    char* chars 
} 

...將展出相同的sizeof結果是否chars指向一個單字節或它指向一個40KB的字符串。

5

根據this IBM referencesizeof施加到參考返回引用對象的大小:

結果是 引用的對象的大小。

所以,我認爲,問題不在於sizeof將返回引用本身的大小,而是說Foo持有指向其他類型。

還要記住,sizeof不會告訴你在vector(或任何其他使用堆的容器)內的數據大小。考慮下面的例子:

struct Foo { 
    std::vector<int> v; 
} 

int main(int argc, char **argv) { 
    Foo foo; 
    std::cout << sizeof(foo) << std::endl; 
    foo.v.push_back(1); 
    std::cout << sizeof(foo) << std::endl; 
} 

Output: 
24 
24 
+2

從C++標準:'5.3.3/2 sizeof:當應用於引用或引用類型時,結果是引用類型的大小.' – Abhay 2010-08-13 14:44:03

+0

感謝您挖掘Abhay。:) – 2010-08-13 14:49:49

4

予處理數據之後和分配大量的數據至f(包含在富成員向量),我需要F對象的大小

sizeof被編譯時操作。它給你剛纔變量或對象本身的固定大小。如果你的對象在其他地方有內存指針(這是內部使用的內存),sizeof將永遠不會深入研究它們來確定它們指向的大小。

如果您需要一些與運行時對象關聯的字節總數的度量,那麼您不能只使用簡單的sizeof。你將不得不加起來所有的作品。例如:sizeof(f) + f.vector_member.size() * sizeof(whaterver_type_that_vector_contains)

0

你能列出你的F類結構嗎?我懷疑你的尺寸合適,sizeof會告訴你類的尺寸,這是類的所有成員的尺寸(這是基於對齊和排序以及編譯器)。它不會告訴你包含其元素的向量的大小,只是向量的引用的大小。

+0

只是注意到,kbrimington張貼基本上相同的東西。我是一個更慢的typer :) – pstrjds 2010-08-13 14:37:28

0

使用這個測試案例:

class Foo 
{ 
    char x [100]; 
} ; 

void getf(Foo &f) 
{ 
    std::cout<<"sizeof f:" << sizeof f<<std::endl; 
} 

我得到sizeof f:100打印。所以,你的代碼是正確的;你只是把它解釋錯了。

1

sizeof在這種情況下,返回您的班級的大小。你說你給Foo分配了數據,但是你沒有定義Foo。我懷疑它看起來somethign像這樣:

class Foo 
{ 
public: 
    string my_str; 
    int* my_ints; 
}; 

然後你做這樣的事情:

Foo f; 
f.my_str = "Hello, Foo."; 
f.my_ints = new int[1000]; 

...並期待sizeof(f)現在是富的大小,加上的大小字符串,加上int數組的大小。但事實並非如此。 Foo從不改變大小,因爲它不具有char數組或int數組。相反,它有一個string對象(它可能有一個指向char數組的指針)和一個指向int的指針。分配給字符串和int數組的內存不是「in」Foo,它是由Foo指向的。

0

如果你有一個這樣的類:

class Foo 
{ 
    std::vector<int> intVec; 

    // .... 
}; 

sizeof運營商,其在編譯時的作品,將只包括vector的實例數據成員的大小。它不會給你矢量元素的總大小,它存儲在堆的某個地方,並由矢量的某個私有成員指向。

如果你真的想弄清楚矢量使用的內存總量,我不認爲有一種便攜的方式來做到這一點。 vector實現可以分配它沒有使用的內存,所以如果不看實現,你並不知道它在做什麼。

+0

'容量()'方法應該給你一個相當不錯的主意矢量有多少內存存儲。 – UncleBens 2010-08-14 09:00:56

0

只是附加的註釋:

$ 8.3.2/3明─ 「這是不確定的引用是否需要存儲(3.7)。」

因此,人們不應該總是假定參考佔用存儲空間。當應用於參考操作數時,sizeof返回原始參數的靜態編譯時間sizeof。

相關問題