На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (11) 1 [2] 3 4 ...  10 11 все  ( Перейти к последнему сообщению )  
> Баллада о ссылках в С++
    Цитата applegame @
    То бишь ссылка это просто красявый синтаксис для разыменованного указателя.

    Нет, нет, и ещё раз нет. Откуда вообще пошла эта дурь с тем, что ссылка - это синтаксический сахар для разыменованного указателя?

    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
      Цитата Flex Ferrum @
      Нет, нет, и ещё раз нет. Откуда вообще пошла эта дурь с тем, что ссылка - это синтаксический сахар для разыменованного указателя?

      В чём разница?

      Это сообщение было перенесено сюда или объединено из темы "D vs C++"
        Цитата applegame @
        То бишь ссылка это просто красявый синтаксис для разыменованного указателя.
        Нет, это указатели лишённые основных своих минусов.

        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
          Цитата OpenGL @
          В чём разница?

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

          Это сообщение было перенесено сюда или объединено из темы "D vs C++"
            Цитата Flex Ferrum @
            В том, что ссылка может (под капотом) стать указателем только в определённых случаях. Например, при передаче в функцию, принимающую ссылку. Но если ты в одной области видимости объявишь объект и ссылку на него, то ссылка указателем не станет, ибо в этом нет необходимости.
            Это все внутрикомпиляторные дела. Компилятор запросто может и разыменованный указатель соптимизировать и не создавать реальной переменной. А может и ссылку создать в виде указателя, если ему приспичит. Это не агрумент:
            ExpandedWrap disabled
              void foo(int& x) {
                int& y = x; y = 2;
                int* z = &x; z = 2;
              }
            Полагаю в обоих случаях компилятор сгенерит идентичный код.

            Это сообщение было перенесено сюда или объединено из темы "D vs C++"
            Сообщение отредактировано: applegame -
              Цитата applegame @
              Не совсем понимаю, что именно тебе нужно. Но подозреваю, что это делается аналогично плюсам. Например, специализацией перегруженных операторов.
              Ну это-то понятно. Естественно cool_real_number_having_long_mantissa_with_great_exponent их все имеет. Вопрос в том, как мне complex_number писать. Метакодом я могу напроксить себе какие-нибудь assgn() с нужными if (is(...)) и вместо =, но что-то для меня это как-то костыльно смотрится.

              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                Цитата applegame @
                Это все внутрикомпиляторные дела. Компилятор запросто может и разыменованный указатель соптимизировать и не создавать реальной переменной. А может и ссылку создать в виде указателя, если ему приспичит. Это не агрумент.

                Где-то в стандарте написано, что ссылка - это такой своеобразный вариант указателя? Насколько я знаю, нет. И не может быть написано.

                Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                  Цитата Flex Ferrum @
                  В том, что ссылка может (под капотом) стать указателем только в определённых случаях. Например, при передаче в функцию, принимающую ссылку. Но если ты в одной области видимости объявишь объект и ссылку на него, то ссылка указателем не станет, ибо в этом нет необходимости.

                  Это вопрос оптимизаций. Поведение-то фактически эквивалетно поведению указателя, который автоматически разыменовывается.

                  Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                    Цитата OpenGL @
                    Это вопрос оптимизаций.

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

                    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                    Сообщение отредактировано: Flex Ferrum -
                      Я не вижу тут иную семантику, отличную семантики указателя :-?

                      Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                        Цитата Qraizer @
                        Ну это-то понятно. Естественно cool_real_number_having_long_mantissa_with_great_exponent их все имеет. Вопрос в том, как мне complex_number писать. Метакодом я могу напроксить себе какие-нибудь assgn() с нужными if (is(...)) и вместо =, но что-то для меня это как-то костыльно смотрится.
                        Понятно, о чем ты говоришь. В таких случаях в D используются структуры, которые передаются по значению.
                        Если же твой cool_real_number_having_long_mantissa_with_great_exponent не простой класс, а скажем абстрактный базовый, то тебе всяко придется передавать его по указателю, а значит придется городить тот же метакод из разных оверлоадов.

                        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                          Цитата applegame @
                          Компилятор запросто может и разыменованный указатель соптимизировать и не создавать реальной переменной. А может и ссылку создать в виде указателя, если ему приспичит.
                          В общем случае не может. Даже больше: может в ограниченном количестве случаев. Всё потому, что указатель доступен программисту как есть, поэтому компилятор не может гарантировать, кто где-то, в невидимом ему контексте, этот указатель программером не поменяется, даже если всё время жизни объекта-указателя у него перед глазами.
                          Если интересно и ещё не в курсе, почитай в гугле на тему "pointer aliasing". Учёт этой штуки по факту заставляет компилятор запрещать многие оптимизации. Которые доступны при замене указателей на ссылки, т.к. единственное место, где ссылка может поменять своё значение – это точка её инициализации. Конечно, невелика разница, если рассматриваемый объект является параметром функции/метода, но достаточно представить себе поле класса, и тут уже не всё так шоколадно с указателями и всё прекрасно с ссылками.

                          Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                            Цитата Flex Ferrum @
                            Это не вопрос оптимизаций, это вопрос семантики. Объявление ссылки не порождает самостоятельную сущность (в отличие от указателя).
                            Неверно, порождает. Ведь можно создать переменную ссылочного типа - это вполне конкретная сущность, то что компилятор решил ее соптимизировать в пустоту - это личное дело его оптимизатора. Настоящий алиас присутствует в D. Вот он реально не создает никаких рантайм сущностей, в отличие от плюсовых ссылок:

                            ExpandedWrap disabled
                              void foo(alias a)() {
                                  a++;
                              }
                               
                              void bar() {
                                 int a = 10;
                                 foo!(a);
                                 assert(a == 11);
                              }


                            Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                              Цитата applegame @
                              В таких случаях в D используются структуры, которые передаются по значению.
                              Это ещё почему? Т.е. я не могу структуру рассматривать как неPOD, что ли?

                              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                                Цитата Qraizer @
                                В общем случае не может. Даже больше: может в ограниченном количестве случаев. Всё потому, что указатель доступен программисту как есть, поэтому компилятор не может гарантировать, кто где-то, в невидимом ему контексте, этот указатель программером не поменяется, даже если всё время жизни объекта-указателя у него перед глазами.
                                Да. Но ведь то же самое относится и к ссылке.

                                Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (11) 1 [2] 3 4 ...  10 11 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0427 ]   [ 16 queries used ]   [ Generated: 28.03.24, 10:28 GMT ]