Форум программистов, компьютерный форум CyberForum.ru

Что содержит ссылка? - C++

Восстановить пароль Регистрация
 
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
27.11.2012, 20:27     Что содержит ссылка? #1
Почитал в нескольких местах. Везде одно и то же: "ссылка - это псевдоним". Интересно, а она вообще является отдельной переменной? То есть:
C++
1
2
int x = 2;
int &r = x;
Здесь r это ссылка (т.е. псевдоним) x. А в самой оперативной памяти r будет лежать как отдельная переменная? Я так понял, что да. Что она тогда содержит? Просто где-то прочитал, что ссылка инициализируется адресом переменной. Значит, ссылка содержит адрес. Но адрес содержит указатель, а это ссылка! Каша...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
27.11.2012, 20:31     Что содержит ссылка? #2
Ссылки — это и есть синтаксический сахар над указателями.
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
27.11.2012, 20:43     Что содержит ссылка? #3
Если напечатать адрес ссылки и адрес обычной переменной, то они будут одинаковые:
C++
1
cout << &r << " " << &x;
Получается что сама переменная одна. Но у нее два имени x и r.
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
29.11.2012, 19:21  [ТС]     Что содержит ссылка? #4
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
Получается что сама переменная одна. Но у нее два имени x и r.
А как это вообще понять? Если я возьму листок бумаги и нарисую квадратик (это моя переменная в памяти компьютера), а потом впишу в него число 2, а после над квадратиком поставлю букву х. Вот это моя переменная:
C++
1
int x = 2;
А потом создам ссылку:
C++
1
int &r = x;
И тогда над квадратиком, рядом с буквой х, через запятую напишу букву r и буду понимать, что это 2 имени одной и той же переменной в памяти.

Но это ведь всё схематично, и на бумаге. А как это реализуется в компьютере? Вот это не ясно. С указателем понятно. Указатель - это отдельная переменная в памяти, в которой записан адрес. А вот что есть ссылка не ясно.

Почитал Интернет. На одном сайте нашёл такую фразу: "Ссылка не является переменной" - вообще не понял, что они имели в виду...

В Википедии про ссылки написано: "Ссылка не является указателем, а просто является другим именем для объекта." И тут же следом предложение: "В языках программирования ссылка может быть реализована как переменная, содержащая адрес ячейки памяти." Эти 2 предложения противоречат друг другу. Вначале говорится, что ссылка не является указателем, а потом, - что это переменная содержащая адрес (а это и есть указатель).

И вообще, когда говорят о ссылках, то и дело упоминают указатели. Складывается впечатление, что эти 2 понятия очень связаны. Но при этом что есть указатель подробно описано везде, а вот что есть ссылка нигде не объясняют. Просто псевдоним и всё...
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
29.11.2012, 19:35     Что содержит ссылка? #5
Alex Z, Вот и не стоит воспринимать ее сложнее, чем псевдоним =)
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
29.11.2012, 19:42     Что содержит ссылка? #6
Цитата Сообщение от Alex Z Посмотреть сообщение
"ссылка - это псевдоним"
именно псевдоним т.е одно и тоже
как Го́ликов и Гайдар( Аркадий Петрович не путать с Егор Тимофеевичем) одно и тоже лицо

Добавлено через 1 минуту
Цитата Сообщение от Alex Z Посмотреть сообщение
А в самой оперативной памяти r будет лежать как отдельная переменная?
нет не будет
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
Если напечатать адрес ссылки и адрес обычной переменной, то они будут одинаковые:
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
29.11.2012, 19:43     Что содержит ссылка? #7
ТС, возьми да посмотри, какой асм-листинг получится из такого кода(без оптимизации, а то компилятор всё нафиг повыкидывает):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void prt()
{
    int x = 2;
    int *r = &x;
    *r = 0;
}
 
void ref()
{
    int x = 2;
    int &r = x;
    r = 0;
}
Будут ровно одни и те же инструкции.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
29.11.2012, 19:48     Что содержит ссылка? #8
Цитата Сообщение от NoMasters Посмотреть сообщение
Будут ровно одни и те же инструкции.
щаззз
вот под это выделится память
Цитата Сообщение от NoMasters Посмотреть сообщение
int *r = &x;
поскольку r это адрес x
а вот под это
Цитата Сообщение от NoMasters Посмотреть сообщение
int &r = x;
нет
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
29.11.2012, 19:53     Что содержит ссылка? #9
ValeryS, тебе предъявить листинг? Не вопрос:
alex@mbook /tmp $ g++ -O0 -S t.cpp
alex@mbook /tmp $ cat t.s
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    .file   "t.cpp"
    .text
    .globl  _Z3prtv
    .type   _Z3prtv, @function
_Z3prtv:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $2, -12(%rbp)
    leaq    -12(%rbp), %rax
    movq    %rax, -8(%rbp)
    movq    -8(%rbp), %rax
    movl    $0, (%rax)
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   _Z3prtv, .-_Z3prtv
    .globl  _Z3refv
    .type   _Z3refv, @function
_Z3refv:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $2, -12(%rbp)
    leaq    -12(%rbp), %rax
    movq    %rax, -8(%rbp)
    movq    -8(%rbp), %rax
    movl    $0, (%rax)
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size   _Z3refv, .-_Z3refv
    .ident  "GCC: (GNU) 4.7.2"
    .section    .note.GNU-stack,"",@progbits
Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот под это
int &r = x;
нет
Ну да, а обращаться будем через libastral.
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
29.11.2012, 20:02  [ТС]     Что содержит ссылка? #10
Цитата Сообщение от ValeryS Посмотреть сообщение
нет не будет
А чем она тогда будет если не переменной?


Написано:
C++
1
2
int intOne;
int & rSomeRef = intOne;
И такой комментарий: "В строке 1 объявляется локальная целочисленная переменная intOne, а в строке 2 - ссылка на целочисленное значение rSomeRef, инициализируемая адресом переменной intOne".

Вот после прочтения этого у меня и возник этот вопрос. Тут просто говорится, ссылка инициализируется адресом. Вот я и не могу понять что к чему.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
29.11.2012, 20:47     Что содержит ссылка? #11
Мдя действительно
никогда бы не подумал
но немножко изменим код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void prt()
{
    int x =2;
    int *r = &x;
    *r = 0;
    printf("%u %u \n",&x,&r);
}
 
void ref()
{
    int x =2;
    int &r = x;
    r = 0;
    printf("%u %u \n",&x,&r);
}
и что мы видим
3210428 3210416
3210428 3210428
в первом случае адреса разные
во втором одинаковые
сейчас разберусь с дизасемблером (IDA натравлю) поскольку встроенный дизасемблер(VS2008) показывает идентичный код
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
29.11.2012, 21:04     Что содержит ссылка? #12
ValeryS, лукавишь. Измени так (это правильно, а у тебя не правильно)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void prt()
{
    int x =2;
    int *r = &x;
    *r = 0;
    printf("%u %u \n",&x,&(*r));
}
 
void ref()
{
    int x =2;
    int &r = x;
    r = 0;
    printf("%u %u \n",&x,&r);
}
Ссылка - разыменованный указатель
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
29.11.2012, 21:18  [ТС]     Что содержит ссылка? #13
Цитата Сообщение от activnaya Посмотреть сообщение
Ссылка - разыменованный указатель
А эта фраза: "...ссылка на целочисленное значение инициализируется адресом переменной..." есть ошибка или не есть ошибка? Ссылка действительно инициализируется адресом?
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
29.11.2012, 21:31     Что содержит ссылка? #14
а вот она и разница
код ptr
Assembler
1
2
3
4
5
6
7
8
9
10
11
 mov     [ebp+x], 2
 lea     eax, [ebp+x]    ; 0028F710
 mov     [ebp+r], eax
 mov     eax, [ebp+r]    ; 0028F710
 mov     dword ptr [eax], 0
 mov     esi, esp
 lea     eax, [ebp+r]    ; 0028F704 адрес r
 push    eax
 lea     ecx, [ebp+x]   ; 0028F710 адрес x
 push    ecx            
 push    offset Format   ; "%u %u \n"
код ref

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
mov     [ebp+x], 2
lea     eax, [ebp+x]    ; 0028F710
mov     [ebp+r], eax
mov     eax, [ebp+r]    ; 0028F710
mov     dword ptr [eax], 0
mov     esi, esp
mov     eax, [ebp+r]  ; 0028F710 значение по адресу r  т.е  адрес x
push    eax             
lea     ecx, [ebp+x]  ; 0028F710 адрес x
push    ecx             
push    offset Format   ; "%u %u \n"
call    ds:__imp__printf
lea eax, [ebp+r] ; 0028F704 адрес r
и
mov eax, [ebp+r] ; 0028F710 значение по адресу r т.е адрес x
как видишь ведут себя по разному
но все же закладываться на дизасемблер не стоит
во первых здесь еще не прошел оптимизатор
а во вторых каждый компилятор волен создать свой код

Добавлено через 1 минуту
Цитата Сообщение от activnaya Посмотреть сообщение
Измени так (это правильно, а у тебя не правильно)
Цитата Сообщение от activnaya Посмотреть сообщение
&(*r)
и что мы получим тот же псевдоним???

Добавлено через 1 минуту
Цитата Сообщение от Alex Z Посмотреть сообщение
А эта фраза: "...ссылка на целочисленное значение инициализируется адресом переменной..." есть ошибка или не есть ошибка?
для этого есть стандарт, как он скажет так и будет
а все остальное от лукавого
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.11.2012, 21:40     Что содержит ссылка? #15
Цитата Сообщение от Alex Z Посмотреть сообщение
Ссылка действительно инициализируется адресом?
Нет.
Разве что это ссылка на указатель.
Как правильно сказали выше, ссылка - это просто абстракция над указателем. Следует запомнить, что это просто разименованный указатель, тогда вы будете понимать, что такое "передача по ссылке", к примеру.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
29.11.2012, 21:48     Что содержит ссылка? #16
ValeryS, цитата отсюда. http://www.cracklab.ru/faq/Ассемблер:_команда_LEA
Команда lea используется для загрузки эффективного адреса. Например, если нам надо поместить в eax смещение массива Massiv для последующей работы с ним, то нужно написать так: lea eax, Massiv. Данная команда будет аналогична команде mov eax, offset Massiv.
Так что реализация разыменовывания значения особо и не имеет, а суть та же: ссылка - разыменованный указатель.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
и что мы получим тот же псевдоним???
мы получим корректный пример сравнения, а ты привел некорректный пример.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2012, 22:24     Что содержит ссылка?
Еще ссылки по теме:

Компилятор ругается, не разрешенная внешняя ссылка, что не так? C++
C++ LNK2019: ссылка на неразрешенный внешний символ. Что это за ошибка?
Циклическая ссылка h-ников, что делать? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
29.11.2012, 22:24     Что содержит ссылка? #17
activnaya,
спасибо конечно но я ассемблирую лет так 20 и чем отличается lea от mov как бы знаю
а еще он используется для быстрого умножения
Цитата Сообщение от activnaya Посмотреть сообщение
мы получим корректный пример сравнения, а ты привел некорректный пример.
корректный чего ???
мы тут говорим о том чем ссылка отличается от указателя
а мне предлагают
Цитата Сообщение от activnaya Посмотреть сообщение
(*r)
разыменованный указатель то бишь туже ссылку
ибо правильно сказал diagon

Цитата Сообщение от diagon Посмотреть сообщение
Следует запомнить, что это просто разименованный указатель,
Добавлено через 3 минуты
пардон ты тоже это отметила
Цитата Сообщение от activnaya Посмотреть сообщение
Ссылка - разыменованный указатель
я как то пропустил
Yandex
Объявления
29.11.2012, 22:24     Что содержит ссылка?
Ответ Создать тему
Опции темы

Текущее время: 23:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru