почему ссылочный размер всегда 4 байта - c ++

На 32-битной машине я всегда получаюsizeof из 4 байтов ссылки, даже если это ссылка на двойное число, так что же на самом деле хранится в этих 4 байтах.

EDIT :

<code>class A{
public:
  double&  a;
};

int main(){
  cout << sizeof(A) << endl; // this will print out 4
}
</code>
 Dennis04 мая 2012 г., 12:27
Привет AlexDan - попробуйте загрузить часть своего кода, и, надеюсь, некоторые из downvoters отменит свои downvotes. Укажите конкретный фрагмент кода, где вы ожидали другого результата, и дайте нам знать, что вы ожидали и почему.
 jalf04 мая 2012 г., 12:23
Потому что твой вопрос не имеет смысла. Как говорит @ R.MartinhoFernandes, вы не можете получить размер ссылки. Поэтому, если вы не разместите код, показывающий, что вы на самом делеdoingМы не имеем ни малейшего представления о том, что вы спрашиваете или как на него ответить
 AlexDan04 мая 2012 г., 12:22
почему отрицательные голоса?
 AlexDan04 мая 2012 г., 12:31
Я обновил МОЙ вопрос образцом моего кода.
 R. Martinho Fernandes04 мая 2012 г., 12:19
Вы не можете получить размер ссылки, потому что ссылка не является объектом. Пожалуйста, покажите нам, с каким кодом вы тестируете.

Ответы на вопрос(2)

Решение Вопроса

sizeof (С ++ 11, 5.3.3 / 4):

When applied to a reference or a reference type, the result is the size of the referenced type.

Так что если вы действительно принимаетеsizeof(double&)компилятор говорит вам, чтоsizeof(double) это 4.

Update: Итак, что вы на самом деле делаете, это применятьsizeof к типу класса. В таком случае,

When applied to a class, the result is the number of bytes in an object of that class [...]

Итак, мы знаем, что наличие ссылки внутриA заставляет его занимать 4 байта. Это потому, что, хотя стандарт не предписывает, как ссылки должны быть реализованы, компилятор все равно должен каким-то образом их реализовывать. Это может как-то сильно отличаться в зависимости от контекста, но для ссылочного члена типа класса единственный подход, который имеет смысл, это красться вdouble* за спиной и называя этоdouble& в твое лицо.

Поэтому, если ваша архитектура 32-битная (в которой указатели имеют длину 4 байта), это объясняет результат.

Просто имейте в виду, чтоthe concept ссылки не привязаны к какой-либо конкретной реализации. Стандарт позволяет компилятору реализовывать ссылки так, как он хочет.

Ссылка на C ++not указатель Это псевдоним объекта.Sometimesкомпилятор решает реализовать это с помощью указателя. Но часто он реализует этоdoing nothing at all, Просто сгенерируйте код, который ссылается непосредственно на исходный объект.

В любом случае,sizeof применяется к ссылочному типуdoes not give you the size of a reference, Так что не совсем понятно, что вы делаете, из-за чего невозможно объяснить, что происходит.

Edit

Теперь, когда вы показали код, мы можем ответить на вопрос:

Вы берете размер класса, содержащего ссылку. Как я сказал выше, ссылка не является указателем, но когда это необходимо, компилятор может использовать указатель для ее представления. Когда вы создаете класс, содержащий ссылку, единственный (вменяемый) способ, которым компилятор может реализовать ее, это определить класс, который содержит адрес объекта. В 32-разрядных системах адреса имеют ширину 32 бита или 4 байта. Такsizeof такой класс (как правило) будет 4.

 08 апр. 2016 г., 19:57
Нет, это не так. & # XAF; \ _ (& # x30C4;) _ / & # XAF;
 06 апр. 2016 г., 11:21
Ссылка это точно указатель. Любая оптимизация, с которой может работать компиляторint i; int&r = i, это может сделать сint i; int* r = &i, Любая оптимизация не может быть сделана с указателем, она не может быть сделана со ссылкой. Проблема псевдонимов указателей присутствует в полном объеме и со ссылками.
 04 мая 2012 г., 12:34
Конечно я могу. Если вы делаете что-то вроде этого:int i = 0; int& r = iтогда компиляторы будут как правилоnot генерировать код для размещения указателя наi в стеке. Вместо этого последующие операции наr (сказать,r++) будет просто испускатьexact тот же код, как если бы вы написалиi++ Ссылка это просто псевдоним.
 04 мая 2012 г., 12:31
Неправильно на многих уровнях. & quot; Иногда компилятор решает реализовать это с помощью указателя. Но часто он реализует это, вообще ничего не делая. & Quot; Это ничем не отличается от целого числа или чего-либо еще. Если вы не согласны с этимint i=1; ничего не объявляет (по крайней мере, если вы не меняетеi позже`), вы не можете сказать, что ссылка - это вообще ничто.
 24 янв. 2017 г., 20:05
@StefanDragnev Механически компиляторы обычно реализуют ссылки с указателями, но это не означает, что они - одно и то же. Если ссылка на самом деле не должна быть отдельной сущностью, как, например, в jalfint i = 0; int& r = i; Например, в стандарте (насколько мне известно) нет ничего, что мешало бы лечить компиляторr как синтаксический сахар дляiи просто молча подставляяi когда вы используетеr.

Ваш ответ на вопрос