LINUX.ORG.RU

C++: references


0

0

Позволю себе отдельный топик начать.

>>Гон! Ссылка может вообще не иметь "инкарнации" т.е. физической сущности. Ссылка это АЛИАС!!! Это абстракция и её внутренне представление компилятором никакого отношения не имеет к внутреннему представлению указателя.

>Про инкарнации - это сильно. :) Я тебе еще раз говорю, ссылка РЕАЛИЗУЕТСЯ так же, как и указатель (т.е просто переменной, содержащей адрес объекта).

Кто тебе такую глупость сказал?

>Просто используется по другому. Например, ссылка обязательно должна быть проинициализирована...

Давай ты не будешь мне рассказывать разницу между ссылкой и указателем. Я её сам могу объяснить.

>Возьми код, откомпилируй и посмотри ассемблерный исходник. Ты увидишь, что ссылка и указатель в низкоуровневой реализации не будут отличаться. А значит ответ на вопрос, есть ли различия по памяти - НЕТ различий.

Hint: Как ты думаешь, какой код в общем случае будет предпочтительней, при одинаковом мастерстве программистов, тот который будет делать предположения о реализации там где не надо, или тот который их делать не будет?

>Если хочешь убедить меня в обратном - приведи пример, и я объясню где ты заблуждаешься (или пойму, где сам заблуждаюсь). :)

Пожалуйста, лезем в стандарт. Есть пара ключевых моментов. 8.3.2 1. "О ссылке можно думать как о названии объекта." 3. "Не определяется, действительно ли ссылка требует хранения." Плюс ремарка к 5.3.4 "Т.к. ссылки не являются объектами, ссылку невозможно создать с помощью new." Плюс многочисленные ремарки о том что нельзя создать (на)ссылок(у).

Всё это позволяет утверждать, что pеализации могут сами определять какое внутренне представление будут иметь ссылки. Поэтому утверждение, что ссылка реализуется также как и указатель не верно, если мы говорим о С++ (мы о нём?), а не о конкретном компиляторе.

>P.S. Не могу не выпендриться (но это ни в коем случае не предъявляется как обоснование :) ) - http://tinyurl.com/4ru9q

Ну крут :-) Я прошёл какой-то бесплатный по С++ на мастера на брейнбенче, за остальные деньги платаить не то что бы жаба задушила, но после того как я захотел сертификат получить красивый за этот пройденый экзамен и перевёл им деньги, прождав пару месяцев и позвонив к ним, получил ответ: да есть у нас проблема такая, многие обращаются, подождите ещё пару месяцев, подумал: ну вас нах. Сертификата в бумажном виде, я так и не получил, при том, что живу не в России.

★★★

хорошо, пусть твои ссылки на твоей волшебной платформе используют какой-то свой волшебный механизм. Кто мешает для указателей использовать этот же механизм??

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Не стоит иронизировать. В том неимоверно большом количестве правил в С++ последней инстанцией является стандарт. Я бы мог тебе ответить на вопрос: "Никто, но никто и не обязывает его делать таким", но, думаю, ты сам этот вариант предполагаешь услышать. Ты, наверняка, знаешь как много компиляторов С++ в природе существует и как они все по-разному стандарту соответствуют. Мы говорим о языке, а не о платформе-конкретный компилятор. Можно, конечно, насоздавать сотню трактований стандарта в отдельных моментах основанных на поведении какого-то конкретного копилятора, но зачем?

eRazor ★★★
() автор топика
Ответ на: комментарий от dilmah

А кто-то когда-то также рассуждая, думал о том, что нулевой указатель во внутреннем представлении своём имеет ноль, наступал на грабли..

eRazor ★★★
() автор топика

>Пожалуйста, лезем в стандарт. Есть пара ключевых моментов. 8.3.2 1. "О ссылке можно думать как о названии объекта." 3. "Не определяется, действительно ли ссылка требует хранения." Плюс ремарка к 5.3.4 "Т.к. ссылки не являются объектами, ссылку невозможно создать с помощью new." Плюс многочисленные ремарки о том что нельзя создать (на)ссылок(у).

>Всё это позволяет утверждать, что pеализации могут сами определять какое внутренне представление будут иметь ссылки. Поэтому утверждение, что ссылка реализуется также как и указатель не верно, если мы говорим о С++ (мы о нём?), а не о конкретном компиляторе.

OK, похоже, мы спорим ни о чем. Все таки мои слова верны с точки зрения большинства компиляторов, но то что я не сказал о том, что я говорю про конкретные компиляторы - моя ошибка.

Так что в общем случае ты прав, реализовываться может действительно как угодно. Но большинство компиляторов трактуют ссылки таким образом, каким я говорил - ведь вопрос шел о памяти, а о памяти можно говорить лишь с точки зрения некоторой платформы/компилятора.

WFrag ★★★★
()
Ответ на: комментарий от eRazor

Насчет стандарта с тобой полностью согласен. Имело место мое недопонимания твоей позиции и тонкостей своей позиции.

WFrag ★★★★
()

>> Про инкарнации - это сильно. :) Я тебе еще раз говорю, ссылка РЕАЛИЗУЕТСЯ так же, как и указатель (т.е просто переменной, содержащей адрес объекта).

> Кто тебе такую глупость сказал?

Вспомним Страуструпа - стандарт не обязует делать так или иначе, он обязует однородное поведение. Обычно ссылки - через указатели делаются, если только разработчик компилятора не больной на голову. В бинарнике они абсолютно одинаковы, а разница их поведения реализована на уровне синтаксического анализатора кода - когда тебя компилятор будет по рукам линейкой бить. На спецефических платформах реализация может быть отличная от указателей - но по дефолту мы-то обсуждаем GCC+i386-compatible платформу, или нет??? Тогда и надо говорить, где и когда это было не так - с указанием среды разработки/платформы.

> Hint: Как ты думаешь, какой код в общем случае будет предпочтительней, при одинаковом мастерстве программистов, тот который будет делать предположения о реализации там где не надо, или тот который их делать не будет?

А вот тут ты не прав. Ссылки сделаны как синтаксические "вкусности", а не как критическая необходимость. Чтобы избавится от создания новых объектов в аргументах функций, и застраховаться от арифметики указателей.

> "О ссылке можно думать как о названии объекта."

Правильно - изменить саму ссылку мы не можем, только то, на что она ссылается - т.е. с ссылкой мы фактически не можем работать как с объектом.

> "Не определяется, действительно ли ссылка требует хранения."

Ну да, ссылка внутри функции на обюъект в той же функции хранения не потребует - но мы то говорим о случае, когда ссылка инициализируется в функции - а аргументы функции реализуются через стек - иначе затрахаешся с распределением памяти при сворачивании функции при выходе - и тогда как раз (в нашем частном случае) и будет реализована ссылка как указатель в стеке.

> "Т.к. ссылки не являются объектами, ссылку невозможно создать с помощью new."

Банально, и не к обсуждаемому случаю.

Тогда надо говорить, в каком случае что и как происходит - мы эе обсуждали случай с передачей ссылок как аргументы функции, а не ссылки "вообще".

Spectr ★★★
()
Ответ на: комментарий от Spectr

Простите, что я вмешиваюсь... Я правда нигде не сертифицировался... Но вроде бы последней инстанцией является компилятор... Давайте просто сделаем g++ -S <имя_рекъ> (ну или кто там чем пользуется), и после этого обнимемся и поцелуемся?.. ;-)

tarle
()

шли годы, но приплюснутые всё спорили

anonymous
()
Ответ на: комментарий от Spectr

> Ссылки сделаны как синтаксические "вкусности", а не как критическая необходимость.

Ссылки "сделаны" именно как "критическая необходимость". Чтобы избежать зацикливания в конструкторе копии.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.