假設我有一個類如何通過引用獲取對象的大小?
class Foo {
:
:
}
我有另一個功能
void getf(Foo &f) {
:
:
std::cout<<sizeof f<<std::endl;
}
予處理數據和分配大量的數據至f(包含在富成員向量)後,我需要的大小f對象
但是,正如我在上面所做的那樣,我總是得到16,這是參考的大小。
我做錯了什麼?怎麼做?
謝謝!
假設我有一個類如何通過引用獲取對象的大小?
class Foo {
:
:
}
我有另一個功能
void getf(Foo &f) {
:
:
std::cout<<sizeof f<<std::endl;
}
予處理數據和分配大量的數據至f(包含在富成員向量)後,我需要的大小f對象
但是,正如我在上面所做的那樣,我總是得到16,這是參考的大小。
我做錯了什麼?怎麼做?
謝謝!
sizeof
返回類型的大小。通常,在Vector
的情況下,類型的大小不一定包括該類型可指向的所有內容的累積大小。例如,鍵入:
class Foo {
char* chars
}
...將展出相同的sizeof結果是否chars
指向一個單字節或它指向一個40KB的字符串。
根據this IBM reference,sizeof
施加到參考返回引用對象的大小:
結果是 引用的對象的大小。
所以,我認爲,問題不在於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
從C++標準:'5.3.3/2 sizeof:當應用於引用或引用類型時,結果是引用類型的大小.' – Abhay 2010-08-13 14:44:03
感謝您挖掘Abhay。:) – 2010-08-13 14:49:49
予處理數據之後和分配大量的數據至f(包含在富成員向量),我需要F對象的大小
sizeof
被編譯時操作。它給你剛纔變量或對象本身的固定大小。如果你的對象在其他地方有內存指針(這是內部使用的內存),sizeof
將永遠不會深入研究它們來確定它們指向的大小。
如果您需要一些與運行時對象關聯的字節總數的度量,那麼您不能只使用簡單的sizeof
。你將不得不加起來所有的作品。例如:sizeof(f) + f.vector_member.size() * sizeof(whaterver_type_that_vector_contains)
。
你能列出你的F類結構嗎?我懷疑你的尺寸合適,sizeof會告訴你類的尺寸,這是類的所有成員的尺寸(這是基於對齊和排序以及編譯器)。它不會告訴你包含其元素的向量的大小,只是向量的引用的大小。
只是注意到,kbrimington張貼基本上相同的東西。我是一個更慢的typer :) – pstrjds 2010-08-13 14:37:28
使用這個測試案例:
class Foo
{
char x [100];
} ;
void getf(Foo &f)
{
std::cout<<"sizeof f:" << sizeof f<<std::endl;
}
我得到sizeof f:100
打印。所以,你的代碼是正確的;你只是把它解釋錯了。
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指向的。
如果你有一個這樣的類:
class Foo
{
std::vector<int> intVec;
// ....
};
的sizeof
運營商,其在編譯時的作品,將只包括vector
的實例數據成員的大小。它不會給你矢量元素的總大小,它存儲在堆的某個地方,並由矢量的某個私有成員指向。
如果你真的想弄清楚矢量使用的內存總量,我不認爲有一種便攜的方式來做到這一點。 vector實現可以分配它沒有使用的內存,所以如果不看實現,你並不知道它在做什麼。
'容量()'方法應該給你一個相當不錯的主意矢量有多少內存存儲。 – UncleBens 2010-08-14 09:00:56
只是附加的註釋:
$ 8.3.2/3明─ 「這是不確定的引用是否需要存儲(3.7)。」
因此,人們不應該總是假定參考佔用存儲空間。當應用於參考操作數時,sizeof返回原始參數的靜態編譯時間sizeof。
自從我做了C++之後已經有一段時間了 - 但不是'sizeof * f'嗎? – ChrisF 2010-08-13 14:28:38
f是一個不是指針的引用,對吧? – skydoor 2010-08-13 14:29:23
嗯......你的參考文獻是16字節長?大部分我看起來都是4.您的機器可以提供多少內存? – 2010-08-13 14:32:00