Re[13]: Не могу понять ссылки в C++
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.06.24 08:51
Оценка: :)
Здравствуйте, rg45, Вы писали:

ЕМ>>Оно "кому надо" и так интересно.


R>Ну и кому, напрмер?


Тем, кто желает определиться, стоит им заставлять себя полюбить шаблонную магию с целью "овладения истинным C++", или нет. При наличии высказываний как за, так и против, у них есть возможность выбирать.

R>Речь шла о "хоть каких-нибудь" результатах. О "профессионально" речи не шло и близко.


Ну вот я вообще никогда не выращивал никаких фруктов, овощей или ягод — ни профессионально, ни по-любительски. По-Вашему, у меня нет "морального права" судить об их качестве и вкусе. Но, слава богу, для этого мне не требуется чьей-то санкции, да и людей, с которыми мы совпадаем в оценках, вполне достаточно.

R>Ну, именно так и говорят все лисы, которые не дотянулись до винограда.


Я догадываюсь, что в этом месте мне должно стать стыдно, и должно появиться желание тянуться. Но не становится. Возможно, потому, что лисы не едят винограда, у них другой рацион.
Re[14]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 08:55
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Тем, кто желает определиться, стоит им заставлять себя полюбить шаблонную магию с целью "овладения истинным C++", или нет. При наличии высказываний как за, так и против, у них есть возможность выбирать.


То есть, примеров нет? Понял.

ЕМ>Ну вот я вообще никогда не выращивал никаких фруктов, овощей или ягод — ни профессионально, ни по-любительски. По-Вашему, у меня нет "морального права" судить об их качестве и вкусе. Но, слава богу, для этого мне не требуется чьей-то санкции, да и людей, с которыми мы совпадаем в оценках, вполне достаточно.


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

ЕМ>Я догадываюсь, что в этом месте мне должно стать стыдно, и должно появиться желание тянуться. Но не становится. Возможно, потому, что лисы не едят винограда, у них другой рацион.


Ну, то, что ты начал думать в эту сторону — это уже хорошо.
--
Отредактировано 16.06.2024 9:11 rg45 . Предыдущая версия . Еще …
Отредактировано 16.06.2024 9:06 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:04 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:03 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 8:58 rg45 . Предыдущая версия .
Re[15]: Не могу понять ссылки в C++
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.06.24 09:29
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>То есть, примеров нет?


Так их и не должно быть. Эти высказывания не адресованы конкретным людям, их задача — просто лежать рядом с теми высказываниями, против которых они направлены, дабы абстрактный читатель имел возможность ознакомиться с разными мнениями, а не только с официально одобренными.

R>если ты никогда не выращивал никаких фруктов, овощей и ягод, то твое мнение в этой области вряд ли сможет заинтересовать людей, которые выращивали.


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

Если что, моей квалификации вполне достаточно для создания и нового языка, и компилятора с него. Но рожать новый язык "чиста по приколу" не вижу смысла, а разработку профессиональной системы программирования мне одному в разумные сроки не потянуть.

R>Мне не очень понятно, на что ты надеешься, делая столь категоричные утверждения.


Только на то, что они дадут кому-то пищу для ума.
Re[16]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 09:33
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

R>>То есть, примеров нет?


ЕМ>Так их и не должно быть.


Ну, пока фактом является только то, что их нет. Все остальное — спорные утверждения.

ЕМ>В данном случае речь прежде всего о потреблении. Даже если оно не заинтересует выращивателей, то может как-то повлиять на предпочтения потребителей.


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

ЕМ>Если что, моей квалификации вполне достаточно для создания и нового языка, и компилятора с него.


Об этом еще кто-нибудь знает, кроме тебя?
Можно себе представить, что там за язык. Один язык не осилил, зато написал на нем свой язык и осилил
Это точно как в том анекдоте: товарищ прапорщик так задолбался собирать кубик Рубика, что изобрел свой — одноцветный и монолитный.

R>>Мне не очень понятно, на что ты надеешься, делая столь категоричные утверждения.

ЕМ>Только на то, что они дадут кому-то пищу для ума.

Ну, это достаточно самонадеянно с твоей стороны, по-моему. Ну, разве что, по схеме "послушай 'эксперта' и сделай наоборот".
--
Отредактировано 16.06.2024 13:26 rg45 . Предыдущая версия . Еще …
Отредактировано 16.06.2024 13:23 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 10:16 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 10:16 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:57 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:57 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:47 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:44 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:41 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:39 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:38 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 9:37 rg45 . Предыдущая версия .
Re[3]: Не могу понять ссылки в C++
От: r0nd  
Дата: 16.06.24 16:19
Оценка:
On Jun 15, 2024, 2:09 PM, rg45 <49596@users.rsdn.org> wrote:

R>- Указатель — объект, а ссылка — нет;


Если под объектом понимается "нечто в памяти", то утверждение неверно:

#include <iostream>

struct A {
    int & a;
    int & b;
    int & c;
};

struct B {
    int * a;
    int * b;
    int * c;
};

int main()
{
    int a;
    int b;
    int c;
    
    A aa = {a, b, c};
    
    std::cout<< "A: " << sizeof(A);
    std::cout<< "aa: " << sizeof(aa);
    
    B bb = {&a, &b, &c};
    
    std::cout<< "B: " << sizeof(B);
    std::cout<< "bb: " << sizeof(bb);

    return 0;
}


R>- У указателя есть адрес, а у ссылки нет;


У всего есть адрес, в том числе и ссылок:


#include <stdio.h>

static char b = '1';

int main()
{
    char& a = b;
    char* c = &b;

    printf("0x%x, 0x%x, 0x%x", &a, c, &b);

    return 0;
}

b:
        .byte   49
.LC0:
        .string "0x%x, 0x%x, 0x%x"
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     QWORD PTR [rbp-8], OFFSET FLAT:b
        mov     QWORD PTR [rbp-16], OFFSET FLAT:b
        mov     rdx, QWORD PTR [rbp-16] ; как видите здесь другой адрес
        mov     rax, QWORD PTR [rbp-8] ; и снова другой адрес (таким образом утверждение что у ссылки нет адреса - ложно), видите это? Мы адресуемся по другому адресу, нет никакого "алиаса"
        mov     ecx, OFFSET FLAT:b
        mov     rsi, rax
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        mov     eax, 0
        leave
        ret


“Nothing is impossible. The word itself says ‘I’m possible!'” ― Audrey Hepburn
Re[4]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 16:56
Оценка: :)
Здравствуйте, r0nd, Вы писали:

R>Если под объектом понимается "нечто в памяти", то утверждение неверно:


"Если"? А если не понимается? Ты где такое определение видел? Функции — тоже "нечто в памяти", значит функции — это тоже объекты по-твоему?
--
Отредактировано 16.06.2024 17:09 rg45 . Предыдущая версия .
Re[4]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 17:04
Оценка: +2
Здравствуйте, r0nd, Вы писали:

R>У всего есть адрес, в том числе и ссылок:


Ты путаешь, операция взятия адреса над ссылкой возвращает совсем-совсем не адрес ссылки. В С++ даже не существует такого типа данных, которым можно было бы представить адрес ссылки.
--
Отредактировано 16.06.2024 17:24 rg45 . Предыдущая версия .
Re[4]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 17:40
Оценка: +1
Здравствуйте, r0nd, Вы писали:

R>Если под объектом понимается "нечто в памяти", то утверждение неверно:


Так, чтоб расставить точки над "i". Сылки в C++ — это отдельные от объектов типы данных, так же как и функции:

https://timsong-cpp.github.io/cppwp/n4861/basic.types#1

[ Note: [basic.types] and the subclauses thereof impose requirements on implementations regarding the representation of types. There are two kinds of types: fundamental types and compound types. Types describe objects, references, or functions. — end note]


Неотъемлемым свойсвом всех типов объектов является возможность образования производных типов — указателей на объеты и ссылок на объекты. Но нет в языке С++ таких типов данных как указатели на ссылки и ссылки на ссылки. Потому что ссылки — не объекты.

Нестатическая член-ссылка даже не является подобъектом родительского объекта:

https://timsong-cpp.github.io/cppwp/n4861/class.mem#4

[Note 2 : A non-static data member of non-reference type is a member subobject of a class object (6.7.2). —end note]


А под "нечто в памяти" подпадает много чего — функции, виртуальные таблицы и указатели на них, паддинг между членами классов. Не нужно думать, что все, что вам удалось разглядеть в дампе — это все объекты.
--
Отредактировано 16.06.2024 17:53 rg45 . Предыдущая версия . Еще …
Отредактировано 16.06.2024 17:49 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 17:42 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 17:42 rg45 . Предыдущая версия .
Отредактировано 16.06.2024 17:41 rg45 . Предыдущая версия .
Re[5]: Не могу понять ссылки в C++
От: r0nd  
Дата: 16.06.24 17:45
Оценка: -3
On Jun 16, 2024, 8:04 PM, rg45 <49596@users.rsdn.org> wrote:

R>"Если"? А если не понимается?


Тогда конкретизируй что ты имеешь ввиду под термином "объект" в контексте "Указатель — объект, а ссылка — нет"?

R>Ты путаешь, операция взятия адреса над ссылкой возвращает совсем-совсем не адрес ссылки.


Подожди, давай так далеко не уходить, нарекания/замечания к опубликованному коду у тебя есть? Ты видишь что адреса отличаются у статической переменной, у указателя и ссылки? Таким образом твое второе утверждение "У указателя есть адрес, а у ссылки нет" — ложно? А "путаешь-не путаешь", я думаю меня убедит контр-примером кода, где четко будет видно что "у ссылки нет адреса". Я помню, что мне кто-то даже говорил, что "на С++ можно сделать все" и когда говорят что что-то нельзя или чего-то нет — это выглядит, как минимум, громко и требует доказательств.


“Success usually comes to those who are too busy looking for it.” — Henry David Thoreau
Re[6]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 17:51
Оценка: +3 :)
Здравствуйте, r0nd, Вы писали:


R>Тогда конкретизируй что ты имеешь ввиду под термином "объект" в контексте "Указатель — объект, а ссылка — нет"?


Подробности здесь
Автор: rg45
Дата: 16.06 20:40
.

R>>Ты путаешь, операция взятия адреса над ссылкой возвращает совсем-совсем не адрес ссылки.


R>Подожди, давай так далеко не уходить, нарекания/замечания к опубликованному коду у тебя есть?


Есть — в этом коде нет обещанного — адреса ссылки. Повторюсь, операция взятия адреса, выполненная над ссылкой, не возвращает адрес ссылки. Более того, в С++ даже нет типа данных, которым можно было бы представить адрес ссылки.
--
Отредактировано 16.06.2024 17:56 rg45 . Предыдущая версия . Еще …
Отредактировано 16.06.2024 17:54 rg45 . Предыдущая версия .
Re[5]: Не могу понять ссылки в C++
От: r0nd  
Дата: 16.06.24 17:59
Оценка:
On Jun 16, 2024, 8:40 PM, rg45 <49596@users.rsdn.org> wrote:

R>

R>Types describe objects, references, or functions. — end note]


Так а что это доказывает, что типы описывают объекты или что? Давай не будем уходит к типам, потому что это вторично, пока не дано определение что есть объект? Так вот возвращаясь к ранее написанному, все-таки определение что "объект — это нечто в памяти" тебя не устраивает? Или что?


“Happiness is not something readymade. It comes from your own actions.” — Dalai Lama
Re[4]: Не могу понять ссылки в C++
От: Stanislav V. Zudin Россия  
Дата: 16.06.24 18:02
Оценка: +3
Здравствуйте, r0nd, Вы писали:

R>>- У указателя есть адрес, а у ссылки нет;


R>У всего есть адрес, в том числе и ссылок:


R>
#include <stdio.h>

R>static char b = '1';

R>int main()
R>{
R>    char& a = b;
R>    char* c = &b;

R>    printf("0x%x, 0x%x, 0x%x", &a, c, &b);

R>    return 0;
R>}
R>


Извиняюсь, что встреваю в разговор, но ты смотрел, что выводит твой код?

Program returned: 0
0x404018, 0x404018, 0x404018


"&a" возвращает, как и ожидается, ни что иное, как адрес объекта, на который ссылается ссылка.

В зависимости от контекста ссылка может работать как ненулевой указатель, поэтому в первом примере sizeof(aa) == sizeof(bb).
А может работать как псевдоним на уровне исходного кода, это демонстрирует второй пример.
Об этом выше уже упоминали.
_____________________
С уважением,
Stanislav V. Zudin
Re[7]: Не могу понять ссылки в C++
От: r0nd  
Дата: 16.06.24 18:14
Оценка: :)))
On Jun 16, 2024, 8:51 PM, rg45 <49596@users.rsdn.org> wrote:

R>Есть — в этом коде нет обещанного — адреса ссылки.


То есть ты не видишь смещения в 8 байт относительно регистра стека? Таким образом, что на хранение ссылки "кем-то" было выделено дополнительная память на стеке. Или я не правильно читаю ассемблерный код? Если бы было верно утверждение "указателя есть адрес, а у ссылки нет", то не было бы никакого смещения, а был бы адрес переменной без смещения? Выходит адрес у ссылки есть, и он имеет размер.

Хорошо, вот если взять мой ассемблерный код, и попробовать его "реверснуть" ты можешь сказать, что является ссылкой и что является указателем первоночально ([rbp-8] или [rbp-16])?

b:
        .byte   49
.LC0:
        .string "0x%x, 0x%x, 0x%x"
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     QWORD PTR [rbp-8], OFFSET FLAT:b
        mov     QWORD PTR [rbp-16], OFFSET FLAT:b
        mov     rdx, QWORD PTR [rbp-16] 
        mov     rax, QWORD PTR [rbp-8] 
        mov     ecx, OFFSET FLAT:b
        mov     rsi, rax
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        mov     eax, 0
        leave
        ret


“Fake it until you make it! Act as if you had all the confidence you require until it becomes your reality.” — Brian Tracy
Re[6]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 18:15
Оценка: +1
Здравствуйте, r0nd, Вы писали:

R>>

R>>Types describe objects, references, or functions. — end note]


R>Так а что это доказывает, что типы описывают объекты или что?


Это определяет ссылки, как отдельные от объетов типы данных — так же как и функции.

R>Давай не будем уходит к типам, потому что это вторично,


Да вот нет, говоря о принадлежности (или непринадлежности) ссылок к объектам, мы говорим как раз о типах данных. И этого определения достаточно, чтобы констатировать, что ссылки — это отдельные от объектов типы данных. Я там приводил и другие доводы, но ты предпочел их отбросить, почему-то.

R>пока не дано определение что есть объект?


Так а как ты строишь свои рассуждения, не имея определения объекта?

R>Так вот возвращаясь к ранее написанному, все-таки определение что "объект — это нечто в памяти" тебя не устраивает? Или что?


Ты строишь свои рассуждения на тезисе, что любое нечто в памяти — это объект. А с этим я согласиться не могу, конечно же.
--
Отредактировано 16.06.2024 18:18 rg45 . Предыдущая версия . Еще …
Отредактировано 16.06.2024 18:17 rg45 . Предыдущая версия .
Re[8]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 18:20
Оценка:
Здравствуйте, r0nd, Вы писали:

R>То есть ты не видишь смещения в 8 байт относительно регистра стека?


При чем тут смещение? Я по этому поводу высказывался уже, не заставляй меня повторяться, пожалуйста:

http://rsdn.org/forum/cpp/8761797.1
Автор: rg45
Дата: 16.06 20:40


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

--
Re[5]: Не могу понять ссылки в C++
От: r0nd  
Дата: 16.06.24 18:23
Оценка: -1
On Jun 16, 2024, 9:02 PM, Stanislav V. Zudin <4579@users.rsdn.org> wrote:

SVZ>Извиняюсь, что встреваю в разговор, но ты смотрел, что выводит твой код?

SVZ>

Program returned: 0
SVZ>0x404018, 0x404018, 0x404018


Этот код именно это и должен выводить.

SVZ>«&a» возвращает, как и ожидается, ни что иное, как адрес объекта, на который ссылается ссылка.


Да. Именно это и было целью, однако там дальше есть ассемблерный код, который несмотря на идентичность вывода, адресуется по разным адресам. Что «несколько» противоречит утверждению, что у ссылки нет адреса в памяти. Я утверждаю что есть, ассемблер утверждает что есть. Как же быть?


“Folks are usually about as happy as they make up their minds to be.” — Abraham Lincoln
Re[6]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 18:28
Оценка: :)
Здравствуйте, r0nd, Вы писали:

R>Да. Именно это и было целью, однако там дальше есть ассемблерный код, который несмотря на идентичность вывода, адресуется по разным адресам. Что «несколько» противоречит утверждению, что у ссылки нет адреса в памяти. Я утверждаю что есть, ассемблер утверждает что есть. Как же быть?


Да ты можешь приводить хоть километры ассемблерного кода. Но нет в С++ таких типов данных, как ссылка на ссылку и указатель на ссылку. И член-ссылка не является подобъектом объекта. Все, этого достаточно, чтобы утверждать, что ссылка — не объект.
--
Re[6]: Не могу понять ссылки в C++
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.06.24 18:35
Оценка: +1 :)
Здравствуйте, r0nd, Вы писали:

R>Что «несколько» противоречит утверждению, что у ссылки нет адреса в памяти. Я утверждаю что есть, ассемблер утверждает что есть.


А кто пытался убедить Вас в том, что у типа данных "ссылка" якобы нет адреса в памяти? Вам говорят лишь то, что ссылка не является объектом в терминологии C++, и в языке нет штатного способа получить адрес в памяти, где хранится содержимое ссылки.
Re[6]: Не могу понять ссылки в C++
От: rg45 СССР  
Дата: 16.06.24 18:35
Оценка: +2
Здравствуйте, r0nd, Вы писали:

R>Этот код именно это и должен выводить.


SVZ>>«&a» возвращает, как и ожидается, ни что иное, как адрес объекта, на который ссылается ссылка.


R>Да. Именно это и было целью, однако там дальше есть ассемблерный код, который несмотря на идентичность вывода, адресуется по разным адресам. Что «несколько» противоречит утверждению, что у ссылки нет адреса в памяти. Я утверждаю что есть, ассемблер утверждает что есть. Как же быть?


Смотри сюда, Фома неверующий:

https://en.cppreference.com/w/cpp/language/object

The following entities are not objects: value, reference, function, enumerator, type, non-static class member, template, class or function template specialization, namespace, parameter pack, and this.


Не стандарт, конечно же, но как-то понадежнее, чем твое "нечто в памяти"
--
Отредактировано 16.06.2024 18:49 rg45 . Предыдущая версия .
Re[7]: Не могу понять ссылки в C++
От: r0nd  
Дата: 16.06.24 18:36
Оценка:
On Jun 16, 2024, 9:15 PM, rg45 <49596@users.rsdn.org> wrote:

R>Так а как ты строишь свои рассуждения, не имея определения объекта?


Так для того, чтоб что-то утверждать наверняка мы должны сойтись в терминах? Я свое определение что есть объект дал. Что ты называешь объектом?

R>>Так вот возвращаясь к ранее написанному, все-таки определение что «объект — это нечто в памяти» тебя не устраивает? Или что?


R>Ты строишь свои рассуждения на тезисе, что любое нечто в памяти — это объект. А с этим я согласиться не могу, конечно же.


И я не согласен с такой интерпретацией. Не хочу тебя ловить на перекручивании фактов, однако все-таки я придерживаюсь определения что «объект — это нечто в памяти», я не утверждал что «любое нечто в памяти — это объект». Тем не менее, возвращаясь к ранее изложеному, что ты называешь объектом?


“If you are working on something that you really care about, you don’t have to be pushed. The vision pulls you.” — Steve Jobs
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.