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

Сравнение указателей и ссылок. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.94
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
15.06.2010, 19:35     Сравнение указателей и ссылок. #1
Цитата Сообщение от Evg Посмотреть сообщение
В си есть указатели. Указатель и ссылка на низком уровне это одно и то же, но на уровне языка - разные вещи
Не совсем так для них компилятор вырабатывает разный ассемблерный код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    //mov dword ptr [dwC], 18h;
    int dwC=24;
    //Передача по ссылке
    //lea eax,[dwC]
    //mov dword ptr [ldwC1],eax
    int *ldwC1 (&dwC);         //значение получено ldwC1[0]-24
    //Присваивание другого указателя
    //mov eax,dword ptr [ldwC1]
    //mov dword ptr [ldwC2],eax
    int *ldwC2=ldwC1;          //значение получено ldwC2[0]-24
    //Присваивание адреса с преобразованием
    //mov eax,dword ptr [dwC] 
        //mov dword ptr [ldwC3],eax 
    int *ldwC3=*(int**)&dwC;   //значение не получено ldwC3[0]-неопределено
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
15.06.2010, 19:57     Сравнение указателей и ссылок. #2
Цитата Сообщение от NightmareCode Посмотреть сообщение
Не совсем так для них компилятор вырабатывает разный ассемблерный код
При этом в качестве доказательства приведён код, в котором нет ни одной ссылки. Ну-ну...
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
15.06.2010, 20:07  [ТС]     Сравнение указателей и ссылок. #3
Цитата Сообщение от Evg Посмотреть сообщение
При этом в качестве доказательства приведён код, в котором нет ни одной ссылки. Ну-ну...
Я к тому что ссылка и указатель не всегда одно и тоже на низком уровне.

Адрес и указатель-вот это одно и тоже.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
15.06.2010, 20:32     Сравнение указателей и ссылок. #4
Цитата Сообщение от NightmareCode Посмотреть сообщение
Я к тому что ссылка и указатель не всегда одно и тоже на низком уровне.
Приведи пример, когда это не одно и то же

Цитата Сообщение от NightmareCode Посмотреть сообщение
Адрес и указатель-вот это одно и тоже.
Это по определению
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
16.06.2010, 16:08  [ТС]     Сравнение указателей и ссылок. #5
Цитата Сообщение от Evg Посмотреть сообщение
Приведи пример, когда это не одно и то же
Вот не поленился и привожу пример...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#define  _windows_h_ <windows.h>
#include _windows_h_
 
int main()
{
    int dwC=567;
    //ссылка adrdwC-альтернативное имя dwC
    int &adrdwC=dwC;//adrdwC-не указатель!
    MEMORY_BASIC_INFORMATION objMemory_Basic_Info;
    SIZE_T numberOfBytes=VirtualQuery((LPCVOID)&dwC, &objMemory_Basic_Info, 
 
sizeof(objMemory_Basic_Info));
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define  _windows_h_ <windows.h>
#include _windows_h_
 
int main()
{
    int dwC=567;
    //ссылка adrdwC-альтернативное имя dwC
    int &adrdwC=dwC;//adrdwC-не указатель!
 
    MEMORY_BASIC_INFORMATION* lpMemory_Basic_Info;
    //Будет ошибка так как lpMemory_Basic_Info не инициализирована,
    //даже если указать lpMemory_Basic_Info=NULL, то будет RunTime-ошибка
    SIZE_T numberOfBytes=VirtualQuery((LPCVOID)&dwC, lpMemory_Basic_Info,                           sizeof(MEMORY_BASIC_INFORMATION));
}
Доказательство того что совсем не обязательно ссылка и указатель одно и тоже!
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
16.06.2010, 16:28     Сравнение указателей и ссылок. #6
Напомню ещё раз, что речь шла о том, что указатель и ссылка на НИЗКОМ УРОВНЕ (т.е. на уровне кода) - одно и то же. Далее. В твоём примере была только одна ссылка - addrwC. При этом в обоих примерах у тебя ссылка выглядела одинаково. Далее у тебя есть objMemory_Basic_Info, которое в одном случае переменная, а вдругом случае - укзатель. В итоге что с чем ты сравнивал, я так и не понял. Одно могу сказать точно: сравнения указателя и ссылки у тебя в примере нет. То, что с точки зрения языка (т.е. верхнего уровня) ссылка и указатель разные вещи - с этим никто не спорит. Но вот выражаются они в один и тот же код

Добавлено через 35 секунд
Кажется понял. В первом примере ты считаешь ссылкой конструкцию "&objMemory_Basic_Info". Это не так. Это операция взятия адреса, а не ссылка
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.06.2010, 16:34     Сравнение указателей и ссылок. #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
На счет разного кода утверждать не буду, но:
C++ ссылки отличаются от указателей несколькими особенностями:
- Невозможно ссылаться напрямую на объект ссылочного типа после его определения; каждое упоминание его имени ссылается напрямую на объект, на который он ссылается.
- В качестве результата первого указания не могут быть выполнены ни какие-либо арифметические вычисления, ни приведение типов, ни любые другие операции, кроме копирования их связанных значений в другие ссылки.
- После создания ссылки ее нельзя переделать в ссылку на другой объект; в таких случаях говорят, не может быть переопределена. Это часто делают с указателями.
- Ссылки не могут быть null (т.е.указывать в никуда), тогда как указатели - могут; каждая ссылка ссылается на некий объект, вне зависимости от его корректности.
- Ссылки не могут быть неинициализированными. Так как невозможно переинициализировать ссылку, она должна быть инициализирована сразу после создания. В частности, локальные и глобальные переменные должны быть проинициализированы там же, где они определены, а ссылки, которые являются данными-членами сущностей класса, должны быть инициализированы в списке инициализатора конструктора класса.

Пример:


int& k; // компилятор выдаст сообщение: ошибка: 'k' declared as reference but not initialized ('k' объявлена как ссылка, но не инициализирована)
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
16.06.2010, 16:38  [ТС]     Сравнение указателей и ссылок. #8
Цитата Сообщение от Evg Посмотреть сообщение
Добавлено через 35 секунд
Кажется понял. В первом примере ты считаешь ссылкой конструкцию "&objMemory_Basic_Info". Это не так. Это операция взятия адреса, а не ссылка
Значит книга в которой утверждается, что &-оператор ссылки врет, означающая что следующее за ним идентификатор является именем ссылочного типа
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
16.06.2010, 16:44     Сравнение указателей и ссылок. #9
kazak, всё правильно. Вкратце могу подытожить. Указатели - одна из самых опасных конструкций языка Си. А потому раработчики Си++ задумались о некотром подклассе указателей - указатели, которые указывают на конкретный объект. И оформили в виде отдельного типа - ссылка. Основное отличие ссыки от указателя - гарантия того, что любая ссылка всегда указывает на какой-то объект. В отличие от указателя, который можно крутить-вертеть как угодно, что постоянно является источником ошибок. А так ссылка представляет собой тот же самый указатель (хотя синтаксически выглядит немного не так)

Добавлено через 3 минуты
Цитата Сообщение от NightmareCode Посмотреть сообщение
Значит книга в которой утверждается, что &-оператор ссылки врет, означающая что следующее за ним идентификатор является именем ссылочного типа
Оператор & может использоваться в двух случаях: объявление ссылки (хотя условно можно назвать словом "оператор") и операция взятия адреса. По большому счёту это две совершенно разные конструкции и разработчики языка для ссылки могли бы использовать другой символ (например, #), но посчитали, что нужно заиспользовать тот же символ &

C++
1
2
3
int x;
int &y = x; // здесь & означает объявление ссылки
int *yy = &x; // здесь & означает взятие адреса переменной x
На уровне машинного кода y и yy выражается одними и теми же инструкциями процессора
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
16.06.2010, 16:44     Сравнение указателей и ссылок. #10
Цитата Сообщение от NightmareCode Посмотреть сообщение
Значит книга в которой утверждается, что &-оператор ссылки врет, означающая что следующее за ним идентификатор является именем ссылочного типа
Это только при объявлении ссылки. В остальных случаях & является операцией взятия адресса.
Цитата Сообщение от Evg Посмотреть сообщение
А так ссылка представляет собой тот же самый указатель (хотя синтаксически выглядит немного не так)
На одном из форумов встретил такое определение: Ссылка - это константный разыменованный указатель.
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
16.06.2010, 16:46  [ТС]     Сравнение указателей и ссылок. #11
Цитата Сообщение от kazak Посмотреть сообщение
Это только при объявлении ссылки. В остальных случаях & является операцией взятия адреса.

На одном из форумов встретил такое определение: Ссылка - это константный разыменованный указатель.
Видимо главная проблема-это разное трактование определения ссылки в книгах!
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
16.06.2010, 23:11     Сравнение указателей и ссылок. #12
Цитата Сообщение от kazak Посмотреть сообщение
Ссылка - это константный разыменованный указатель
Как неформальное определение - это именно оно и есть

Добавлено через 6 часов 24 минуты
Да, вот ещё. Чисто для полноты картины

Код

C++
1
2
3
4
5
6
int x;
const int y;
int &p1 = x;
const int &p2 = y;
 
p1 = p2;
эквивалентно с точки зрения исполнения коду с указателями

C
1
2
3
4
5
6
int x;
const int y;
int * const p1 = &x;
const int * const p2 = &y;
 
*p1 = *p2;
Обе переменные p1 и p2 являются const'ами, т.к. после инициализации их уже нельзя модифицировать. В добавок p2 является указателем на const, т.е. по указателю p2 нельзя записывать
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
17.06.2010, 00:17     Сравнение указателей и ссылок. #13
Указатель это число - адрес памяти, с которого начинается выделенная под объект область.
Ссылка это альтернативное имя объекта. Т.е. тупо тот же самый объект,но в коде С++ названный по другому.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
17.06.2010, 09:12     Сравнение указателей и ссылок. #14
Цитата Сообщение от oxotnik Посмотреть сообщение
Ссылка это альтернативное имя объекта
Мы начали спорить о представлении на низком уровне (на уровне машинного кода). На низком уровне ссылка - это тот же самый указатель

Цитата Сообщение от oxotnik Посмотреть сообщение
Т.е. тупо тот же самый объект,но в коде С++ названный по другому
Когда ссылки приходит в виде параметра в процедуру (а в первую очередь для этого ссылки и нужны), то тут гораздо уместнее сравнивать с указателем, чем с объектом-оригиналом (который в данной процедуре попросту недоступен)
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
17.06.2010, 09:37     Сравнение указателей и ссылок. #15
Цитата Сообщение от Evg Посмотреть сообщение
На низком уровне ссылка - это тот же самый указатель
На этом уровне все является указателями (хотя я тут не копенгаген, спорить не буду). И вообще разделение на ссылки и указатели достойно высокого уровня абстракции, а не на уровне машинных кодов.
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
19.06.2010, 14:54  [ТС]     Сравнение указателей и ссылок. #16
Цитата Сообщение от Evg Посмотреть сообщение
Мы начали спорить о представлении на низком уровне (на уровне машинного кода). На низком уровне ссылка - это тот же самый указатель
C++
1
2
3
4
5
6
7
8
        //mov dword ptr [ebp-2A4h],1A59h
    int number=0x1A59;
    //lea eax,[ebp-2A4h]
    //mov dword ptr [ebp-2B0h],eax
    int *pNumber=&number;
    //lea eax,[ebp-2A4h]
    //mov dword ptr [ebp-2BCh],eax 
    int &rt=number;
Да выходит что на низком уровне ссылка-это по сути константный разыменнованый указатель.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
19.06.2010, 16:16     Сравнение указателей и ссылок. #17
Цитата Сообщение от oxotnik Посмотреть сообщение
Указатель это число - адрес памяти, с которого начинается выделенная под объект область.
все-таки указатель - это переменная со своим типом, значение которой - адрес в виртуальной памяти
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
19.06.2010, 16:53     Сравнение указателей и ссылок. #18
Цитата Сообщение от NightmareCode Посмотреть сообщение
Да выходит что на низком уровне ссылка-это по сути константный разыменнованый указатель.
На низком уровне ссылка - это ровно указатель. А вот разыменованный и константный - это уже на высоком уровне (на уровне языка). Т.е. в тексте программы у тебя по сути дела везде присутсвует неявная звёздночка (операция разыменования) - это верхний уровень. При этом низкий уровень (код) не отличаются вообще ничем. Т.е. низкоуровневое представление ссылки полностью эквивалентно представлению указателя
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
19.02.2012, 14:17     Сравнение указателей и ссылок. #19
хотелось бы так же увидеть комментарии по поводу rvalue
Миниатюры
Сравнение указателей и ссылок.  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2012, 15:11     Сравнение указателей и ссылок.
Еще ссылки по теме:

Ступор в возврате указателей и ссылок C++
C++ Демонстрация работы ссылок, указателей или дескрипторов
C++ Сравнение указателей

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
19.02.2012, 15:11     Сравнение указателей и ссылок. #20
Если честно, то вопроса не понял. Конкретно в данном случае ссылка не даёт скорости (ибо эквивалентна указателю). А с чего ты взял, что оно должно увеличить скорость работы? Я так понимаю, что ты где-то что-то прочитал, но не так понял
Yandex
Объявления
19.02.2012, 15:11     Сравнение указателей и ссылок.
Ответ Создать тему
Опции темы

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