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

    Э-э-э, ты внимательно прочитал?

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

      А как он работает? Правильно я понимаю, что он требует передать то, что является именем переменной, и поэтому в данную функцию нельзя передать, например, разыменованный указатель?

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

        Можно объявить. Но память под неё выдеяться не будет (как под указатель) далеко не всегда.

        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
          Цитата Qraizer @
          Это ещё почему? Т.е. я не могу структуру рассматривать как неPOD, что ли?
          Структуры в D умеют тоже, что и классы, кроме традиционного наследования. То бишь это не совсем POD, так как конструкторы и деструкторы могут быть нетривиальными. Логика такова: если объект полиморфный, то его всяко придется передавать по указателю, если же нет, то полиморфное наследование не нужно и можно применять обычные структуры. Зачем они так сделали? Не спрашивайте, я не знаю. Мне это тоже не очень нравится, но на практике особо не мешает.

          Это сообщение было перенесено сюда или объединено из темы "D vs C++"
            Цитата applegame @
            Да. Но ведь то же самое относится и к ссылке.

            Нет. И именно потому, что ссылка не является самостоятельной сущностью.

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

              Добавлено
              Цитата Flex Ferrum @
              Нет. И именно потому, что ссылка не является самостоятельной сущностью.
              Я полагаю, что это implementation defined. А то у тебя получается, что ссылка то является самостоятельной сущностью, то не является. В зависимости от контекста и прихоти компилятора.

              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
              Сообщение отредактировано: applegame -
                Цитата Flex Ferrum @
                Цитата applegame @
                Ведь можно создать переменную ссылочного типа - это вполне конкретная сущность

                Можно объявить. Но память под неё выдеяться не будет (как под указатель) далеко не всегда.

                А вот можно пример, когда, при равнозначном коде, память под указатель должна выделиться, а под ссылку - нет? :rolleyes:

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

                  Добавлено
                  Цитата Flex Ferrum @
                  Нет. И именно потому, что ссылка не является самостоятельной сущностью.
                  Я полагаю, что это implementation defined. А то у тебя получается, что ссылка то является самостоятельной сущностью, то не является. В зависимости от контекста и прихоти компилятора.

                  Как раз таки под указатель память будет выделена всегда. И это отличие - фундаментальное.

                  Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                    Цитата Flex Ferrum @
                    Затем, чтобы была возможность создавать алиасы для объектов.

                    Так зачем? Если верить D&E, то ссылки появились ради перегрузки операторов :) Это можно было решить модификаторами не для типа, а для способа передачи аргументов в функцию и возврата из нее.

                    Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                      Цитата OpenGL @
                      А как он работает? Правильно я понимаю, что он требует передать то, что является именем переменной, и поэтому в данную функцию нельзя передать, например, разыменованный указатель?
                      В этой функции alias - это вообше параметр шаблона. Передается compile-time, и передать туда разыменованный указатель действительно нальзя, потому что адрес неизвестен compile-time.

                      Добавлено
                      Цитата Flex Ferrum @
                      Как раз таки под указатель память будет выделена всегда. И это отличие - фундаментальное.
                      Правда? - https://godbolt.org/g/TPkoRt

                      Добавлено
                      Цитата Qraizer @
                      Э-э-э, ты внимательно прочитал?
                      Да. Потому что упомянутый тобой pointer aliasing в плюсах относится не только к указателям, но и к ссылкам.

                      Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                        а ссылка на указатель - *& - есть в D? :rolleyes:

                        Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                          Цитата _lcf_ @
                          а ссылка на указатель - *& - есть в D? :rolleyes:
                          Да:
                          ExpandedWrap disabled
                            void foo(ref int* s) { s++; }


                          Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                            а если в качестве возвращаемого значения - какой-нибудь нуль(птр/опт/ещекакаянибудьбдня) можно вернуть, или только указатель на объект, который кажет в нульптр?

                            Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                              Цитата applegame @
                              Правда?

                              Правда. Вот смотри. Код:
                              ExpandedWrap disabled
                                void Refs1()
                                {
                                    volatile int a = 10;
                                    volatile int& b = a;
                                    volatile int* c = &b + 1;
                                    
                                    printf("%d", a);
                                    printf("%d", b);
                                    printf("%p", c);
                                }

                              Превращается в итоге в такое вот чудо:
                              ExpandedWrap disabled
                                    .file 3 "no_refs.cpp"
                                    .loc 3 5 0
                                    .cfi_startproc
                                    sub rsp, 56
                                    .seh_stackalloc 56
                                    .cfi_def_cfa_offset 64
                                    .seh_endprologue
                                    .loc 3 6 0
                                    mov DWORD PTR 44[rsp], 10
                                .LVL3:
                                    .loc 3 10 0
                                    mov edx, DWORD PTR 44[rsp]
                                    lea rcx, .LC0[rip]
                                    call    _ZL6printfPKcz
                                .LVL4:
                                    .loc 3 11 0
                                    mov edx, DWORD PTR 44[rsp]
                                    lea rcx, .LC0[rip]
                                    call    _ZL6printfPKcz
                                .LVL5:
                                    .loc 3 12 0
                                    lea rdx, 48[rsp]
                                .LVL6:
                                    lea rcx, .LC1[rip]
                                    call    _ZL6printfPKcz
                                    nop
                                .LVL7:
                                    .loc 3 13 0
                                    add rsp, 56
                                    .cfi_def_cfa_offset 8
                                    ret
                                    .cfi_endproc


                              Добавлено
                              Компиляция с ключами -std=c++17 и -O1.
                              Обрати внимание на строчки 12, 17 и 22. Как можешь заметить, в 12 и 17 идёт обращение к одной и той же области памяти. Если сделать волатильным ещё и сам указатель, то для него будет выделена отдельная ячейка:
                              ExpandedWrap disabled
                                    .file 3 "no_refs.cpp"
                                    .loc 3 5 0
                                    .cfi_startproc
                                    sub rsp, 56
                                    .seh_stackalloc 56
                                    .cfi_def_cfa_offset 64
                                    .seh_endprologue
                                    .loc 3 6 0
                                    mov DWORD PTR 44[rsp], 10
                                .LVL3:
                                    .loc 3 8 0
                                    lea rax, 48[rsp]
                                    mov QWORD PTR 32[rsp], rax
                                    .loc 3 10 0
                                    mov edx, DWORD PTR 44[rsp]
                                    lea rcx, .LC0[rip]
                                    call    _ZL6printfPKcz
                                .LVL4:
                                    .loc 3 11 0
                                    mov edx, DWORD PTR 44[rsp]
                                    lea rcx, .LC0[rip]
                                    call    _ZL6printfPKcz
                                .LVL5:
                                    .loc 3 12 0
                                    mov rdx, QWORD PTR 32[rsp]
                                    lea rcx, .LC1[rip]
                                    call    _ZL6printfPKcz
                                    nop
                                .LVL6:
                                    .loc 3 13 0
                                    add rsp, 56
                                    .cfi_def_cfa_offset 8
                                    ret
                                    .cfi_endproc
                                .LFE1546:


                              Добавлено
                              (строка 13 и 25)

                              Добавлено
                              А для
                              ExpandedWrap disabled
                                    printf("%d", *c);

                              будет сгенерированно:
                              ExpandedWrap disabled
                                .LVL5:
                                    .loc 3 12 0
                                    mov rax, QWORD PTR 32[rsp]
                                    mov edx, DWORD PTR [rax]
                                    lea rcx, .LC0[rip]
                                    call    _ZL6printfPKcz


                              Это сообщение было перенесено сюда или объединено из темы "D vs C++"
                                Цитата Flex Ferrum @
                                Превращается в итоге в такое вот чудо:
                                И что я в этом коде должен увидеть? Вот более приятный для просмотра вид:
                                https://godbolt.org/g/XSBcn3
                                И тут я не вижу выделения памяти ни под ссылку ни под указатель.

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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0560 ]   [ 15 queries used ]   [ Generated: 27.04.24, 10:39 GMT ]