Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.144.197] |
|
Страницы: (11) 1 2 [3] 4 5 ... 10 11 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Сообщ.
#32
,
|
|
|
Цитата applegame @ Настоящий алиас присутствует в D. Вот он реально не создает никаких рантайм сущностей, в отличие от плюсовых ссылок: А как он работает? Правильно я понимаю, что он требует передать то, что является именем переменной, и поэтому в данную функцию нельзя передать, например, разыменованный указатель? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#33
,
|
|
|
Сообщ.
#34
,
|
|
|
Структуры в D умеют тоже, что и классы, кроме традиционного наследования. То бишь это не совсем POD, так как конструкторы и деструкторы могут быть нетривиальными. Логика такова: если объект полиморфный, то его всяко придется передавать по указателю, если же нет, то полиморфное наследование не нужно и можно применять обычные структуры. Зачем они так сделали? Не спрашивайте, я не знаю. Мне это тоже не очень нравится, но на практике особо не мешает.
Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#35
,
|
|
|
Сообщ.
#36
,
|
|
|
Цитата Flex Ferrum @ Ну тоесть в этом плане отличий от указателя нет, так как память под указатель тоже может не выделится. Может будет выделяться, а может нет. Если ссылка - член класса, то память однозначно будет выделяться, как и под указатель. Можно объявить. Но память под неё выдеяться не будет (как под указатель) далеко не всегда. Добавлено Цитата Flex Ferrum @ Я полагаю, что это implementation defined. А то у тебя получается, что ссылка то является самостоятельной сущностью, то не является. В зависимости от контекста и прихоти компилятора.Нет. И именно потому, что ссылка не является самостоятельной сущностью. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#37
,
|
|
|
Цитата Flex Ferrum @ Можно объявить. Но память под неё выдеяться не будет (как под указатель) далеко не всегда. А вот можно пример, когда, при равнозначном коде, память под указатель должна выделиться, а под ссылку - нет? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#38
,
|
|
|
Цитата applegame @ Цитата Flex Ferrum @ Ну тоесть в этом плане отличий от указателя нет. Может будет выделяться, а может нет. Если ссылка - член класса, то однозначно будет. Можно объявить. Но память под неё выдеяться не будет (как под указатель) далеко не всегда. Добавлено Цитата Flex Ferrum @ Я полагаю, что это implementation defined. А то у тебя получается, что ссылка то является самостоятельной сущностью, то не является. В зависимости от контекста и прихоти компилятора.Нет. И именно потому, что ссылка не является самостоятельной сущностью. Как раз таки под указатель память будет выделена всегда. И это отличие - фундаментальное. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#39
,
|
|
|
Так зачем? Если верить D&E, то ссылки появились ради перегрузки операторов Это можно было решить модификаторами не для типа, а для способа передачи аргументов в функцию и возврата из нее. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#40
,
|
|
|
Цитата OpenGL @ В этой функции alias - это вообше параметр шаблона. Передается compile-time, и передать туда разыменованный указатель действительно нальзя, потому что адрес неизвестен compile-time. А как он работает? Правильно я понимаю, что он требует передать то, что является именем переменной, и поэтому в данную функцию нельзя передать, например, разыменованный указатель? Добавлено Цитата Flex Ferrum @ Правда? - https://godbolt.org/g/TPkoRt Как раз таки под указатель память будет выделена всегда. И это отличие - фундаментальное. Добавлено Цитата Qraizer @ Да. Потому что упомянутый тобой pointer aliasing в плюсах относится не только к указателям, но и к ссылкам.Э-э-э, ты внимательно прочитал? Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#41
,
|
|
|
а ссылка на указатель - *& - есть в D?
Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#42
,
|
|
|
Цитата _lcf_ @ Да:а ссылка на указатель - *& - есть в D? void foo(ref int* s) { s++; } Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#43
,
|
|
|
а если в качестве возвращаемого значения - какой-нибудь нуль(птр/опт/ещекакаянибудьбдня) можно вернуть, или только указатель на объект, который кажет в нульптр?
Это сообщение было перенесено сюда или объединено из темы "D vs C++" |
Сообщ.
#44
,
|
|
|
Цитата applegame @ Правда? Правда. Вот смотри. Код: void Refs1() { volatile int a = 10; volatile int& b = a; volatile int* c = &b + 1; printf("%d", a); printf("%d", b); printf("%p", c); } Превращается в итоге в такое вот чудо: .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 идёт обращение к одной и той же области памяти. Если сделать волатильным ещё и сам указатель, то для него будет выделена отдельная ячейка: .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) Добавлено А для printf("%d", *c); будет сгенерированно: .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++" |
Сообщ.
#45
,
|
|
|
Цитата Flex Ferrum @ И что я в этом коде должен увидеть? Вот более приятный для просмотра вид:Превращается в итоге в такое вот чудо: https://godbolt.org/g/XSBcn3 И тут я не вижу выделения памяти ни под ссылку ни под указатель. Это сообщение было перенесено сюда или объединено из темы "D vs C++" |