2016-12-27 49 views
0
#include <iostream> 

using namespace std; 

class Test 
{ 
double &num1; 
public: 
Test(double &num2):num1(num2) 
    { 
     cout<<sizeof(num1);//Prints 8 
    } 
}; 

int main() 
{ 
    double num1=10; 
    Test t(num1); 
    cout<<sizeof(t);//Prints 4 
    return 0; 
} 

爲什麼sizeof()在爲數據成員打印時以及爲對象打印時給出了這個結果?不同類型和數據成員的參考大小

+2

你還期望什麼? –

+0

讓我猜,你正在編譯一個32位系統? – DeiDei

回答

2

num1是一個參考,所以sizeof(num1)給出了對象的大小 - 這裏是一個double

sizeof(T)返回類的大小,而不是類成員可能引用的任何對象的大小。在這種情況下,類的大小可能反映了參考被實現爲double的32位地址的事實。這是該語言沒有提到的一個實現細節。

1

你的類只存儲一個參考 - 因此編譯器知道的4個字節是足夠

2

sizeof(t)sizeof(Test)double&加上任何填充的大小。在你的系統上,顯然,存儲的引用佔用4個字節,並且這種類型沒有使用填充。

sizeof(num1)sizeof(double)因爲這就是您給參考命名時會發生的情況:您實際上是指引用的對象。

2

sizeof返回引用類型在應用於引用時的大小。這意味着在第一種情況下它返回sizeof(double)。在第二種情況下,它返回你的類的大小,它只存儲一個引用。

2

http://en.cppreference.com/w/cpp/language/sizeof

當應用於引用類型,其結果是被引用類型的大小。

sizeof(num1)sizeof(double)

sizeof (Test)是這是需要存儲的參考,這可能是等同於你的情況sizeof (double*)的地方。

+0

實際上,在任何地方,「引用類型的大小」總是等於等效指針類型的大小?你也避免了填充/對齊的問題(在一般情況下)。 –

+0

@LightnessRacesinOrbit:我也不喜歡這個部分。我試圖改進它。 – Jarod42

+0

我真的在問:) –