2016-12-27 3 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() дает этот результат при печати для элементов данных и при печати для объекта?sizeof ссылка для класса и типа данных

+2

Что еще вы ожидали? –

+0

Позвольте мне угадать, вы компилируете для 32-битной системы? – DeiDei

ответ

2

num1 является ссылкой, поэтому sizeof(num1) дает размер объекта - здесь double.

sizeof(T) возвращает размер класса, а не размер любых объектов, на которые могут ссылаться члены класса. В этом случае размер класса может отражать тот факт, что эта ссылка реализована как 32-разрядный адрес double. Это деталь реализации, о которой язык ничего не говорит.

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

Я просил искренне :) –

Смежные вопросы