Размер ссылок в 64-битных средах - PullRequest
6 голосов
/ 19 сентября 2010

Наткнулся на этот вопрос, просматривая ответ на другой вопрос о SO ( References Vs Variable Gets ).Мой вопрос заключается в том, что для всех 64-битных сред гарантируется, что ссылка на переменную будет 64-битной, даже если оригинал имел меньший размер?Как в символьных ссылках в 64-битной среде будет> sizeof (char)?Есть ли в стандарте раздел, в котором это явно указано?

РЕДАКТИРОВАТЬ: для большей ясности - char c1 = 'a';char & c2 = c1;Мой вопрос: sizeof (c2)> sizeof (c1) в 64-битных машинах?

Ответы [ 3 ]

13 голосов
/ 19 сентября 2010

Стандарт (ISO C ++ - 03) говорит следующее о ссылках

It is unspecified whether or not a reference requires storage (3.7).

Пожалуйста, кто-нибудь поправит меня, если я ошибаюсь или если я не правильно понял его вопрос.

EDIT

Мой вопрос: sizeof (c2)> sizeof (c1) в 64-битных машинах?

Нет, поскольку @ Chubsdad заметил sizeof(c2) = sizeof (c1), соответствующая цитата из Стандарта -

When applied to a reference or a reference type, the result is the size of the referenced type. (ISO C ++ $ 5.3.3 / 2)

8 голосов
/ 19 сентября 2010

$ 8.3.2 / 3 - It is unspecified whether or not a reference requires storage.

sizeof, примененный к ссылкам, - это, в основном, размер referrand.

Так что, если 'r' является целочисленной ссылкой на 'i',не определено, есть ли фактическое хранилище для 'r'.Однако sizeof(r) внутренне означает sizeof(i).

Если 'r' является ссылкой на 'char', sizeof(r) всегда будет sizeof(char) == 1 по определению.

4 голосов
/ 19 сентября 2010

Хотя sizeof(ref_var) возвращает размер ссылочного объекта, пространство все еще требуется для хранения ссылки, например, в структуре, и в общих реализациях пространство, выделенное для хранения ссылки, такое же, как пространство, выделенное для хранения указатель Это может не требоваться стандартом, но этот код по крайней мере показывает эффект:

#include <iostream>
using namespace std;

char  c1 = 'a';
char &c2 = c1;
struct x
{
    char  c1;
    char  c2;
    char  c3;
    char  c4;
    int   i4a;
    char &r1; 
    int   i4b;
    int   i4c;
    x() : r1(c1) { }
};
struct y
{
    char  c1;
    char  c2;
    char  c3;
    char  c4;
    int   i4a;
    int   i4b;
    int   i4c;
};
int main()
{
    cout << sizeof(c2) << endl;
    cout << sizeof(y) << endl;
    cout << sizeof(x) << endl;
    return 0;
}

Я не претендую на то, что это «отличный код» - это не так - но он демонстрирует точку зрения. Скомпилированный в MacOS X 10.6.4 с помощью компилятора C ++ из коллекции компиляторов GNU (GCC 4.5.1) в режиме по умолчанию (64-разрядный), вывод:

1
16
24

При компиляции в 32-битном режиме вывод будет:

1
16
20

Первая строка вывода показывает, что 'sizeof(ref_var)' действительно возвращает размер ссылочного объекта. Вторая строка показывает, что структура без ссылки имеет размер 16 байт. Третья строка показывает, что очень похожая структура со ссылкой, встроенной в нее на 8-байтовой границе (в системе, где sizeof(int) == 4), на 8 байт больше, чем более простая структура при 64-битной компиляции, и на 4 байта больше при 32-битная компиляция. Вывод: эталонная часть структуры занимает более 4 байтов и не более 8 байтов при 64-битной компиляции и занимает не более 4 байтов при 32-битной компиляции. Это говорит о том, что (по крайней мере, в одной популярной реализации C ++) ссылка в структуре занимает столько же места, сколько указатель - как утверждается в некоторых других ответах.

Таким образом, это может зависеть от реализации, но комментарий о том, что ссылка занимает то же пространство, что и указатель, остается верным как минимум в одной (довольно широко используемой) реализации.

...