Russian Qt Forum
Ноябрь 22, 2024, 12:47
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
С/C++
>
Ненулевые указатели
Страниц:
1
[
2
]
3
4
5
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Ненулевые указатели (Прочитано 33995 раз)
ViTech
Гипер активный житель
Offline
Сообщений: 858
Re: Ненулевые указатели
«
Ответ #15 :
Ноябрь 12, 2019, 16:56 »
Цитата: Old от Ноябрь 12, 2019, 14:02
Функции отдали во владение объект, сказали делай с ним что хочешь. Выше по стеку этот объект никому не нужен.
Только функции решать, что сделать с этим объектом. Если нужно отдать дальше, то она не будет его удалять.
Кого мы пытаемся ограничить этим функционалом, писателя функции?
С точки зрения вызывающей функции да, неважно, что потом произойдёт с этим указателем, раз уж отдали владение объектом. Тут нужно выяснить, что в вызываемой функции будут делать с этим указателем. Запрет на release мне тоже не очень понятен: если можно перемещать указатель, то объект можно удалить раньше времени и без release/reset, переместив во временный указатель not_null_unique_ptr{move(p)}, в той же строке объект и помрёт
. Но это совсем не отменяет полезность not_null указателей
.
Записан
Пока сам не сделаешь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Ненулевые указатели
«
Ответ #16 :
Ноябрь 12, 2019, 17:00 »
Цитата: ViTech от Ноябрь 12, 2019, 16:56
Но это совсем не отменяет полезность not_null указателей
.
А я нигде про не полезность not_null не говорил.
Я был не очень согласен с претензиями к перемещаемому юнику.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Ненулевые указатели
«
Ответ #17 :
Ноябрь 12, 2019, 17:42 »
С перемещаемым юником всё хорошо) проблема с его мутабельностью - либо он мутабельный и перемещаемый, либо немутабельный и неперемещаемый.
На самом деле, с юником проблемы "нулевого" указателя обычно нет - он обычно создается через make_unique и если избегать явных вызовов .reset(), то всё будет хорошо.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Ненулевые указатели
«
Ответ #18 :
Ноябрь 12, 2019, 18:06 »
Цитата: Авварон от Ноябрь 12, 2019, 17:42
С перемещаемым юником всё хорошо) проблема с его мутабельностью - либо он мутабельный и перемещаемый, либо немутабельный и неперемещаемый.
У меня вызывает большие сомнения потребность в перемещаемом и немутабельном указателе.
Я не вижу сферу его применения.
Да и not_null мне будет полезен только с поддержкой компиляторами, когда они будут бесплатными. Сейчас мне приходится писать assert.
А не будет поддержки, ну и ладно, обойдусь без not_null.
Записан
ViTech
Гипер активный житель
Offline
Сообщений: 858
Re: Ненулевые указатели
«
Ответ #19 :
Ноябрь 12, 2019, 18:35 »
Цитата: Old от Ноябрь 12, 2019, 18:06
Да и not_null мне будет полезен только с поддержкой компиляторами, когда они будут бесплатными. Сейчас мне приходится писать assert.
А в чём сейчас платность gsl::not_null для сырых указателей (да и для умных, если его доделать по уму)? И чем not_null_unique_ptr будет платнее текущего std::unique_ptr? И что должно появиться в компиляторе, чтобы избежать этих плат?
Записан
Пока сам не сделаешь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Ненулевые указатели
«
Ответ #20 :
Ноябрь 12, 2019, 18:46 »
Цитата: ViTech от Ноябрь 12, 2019, 18:35
А в чём сейчас платность gsl::not_null для сырых указателей (да и для умных, если его доделать по уму)? И чем not_null_unique_ptr будет платнее текущего std::unique_ptr? И что должно появиться в компиляторе, чтобы избежать этих плат?
Так сейчас это тот же assert по сути. Платим проверкой. Причем проверка эта на каждое разименование. У меня assert один раз выполняется.
А если компилятор будет их выкидывать, то это будет хоть что-то.
У меня не стоит остро проблема проверки указателей на nullptr. Я очень активно использую ссылки, стараюсь продумывать владения, время создания и разрушения объектов. Поэтому, как-то для меня это не проблема.
«
Последнее редактирование: Ноябрь 12, 2019, 18:59 от Old
»
Записан
ViTech
Гипер активный житель
Offline
Сообщений: 858
Re: Ненулевые указатели
«
Ответ #21 :
Ноябрь 12, 2019, 19:01 »
Цитата: Old от Ноябрь 12, 2019, 18:46
Так сейчас это тот же assert по сути. Платим проверкой.
А если компилятор будет их выкидывать, то это будет хоть что-то.
Дело там не только в assert. Некоторые операции удалены. Например, конструктор по умолчанию, конструктор из nullptr, оператор присваивания из nullptr, и т.п. Т.е. уже на этапе compile-time можно многие вещи уладить, не дожидаясь, когда в run-time assert выбьет. И выразительность кода намного выше, по сигнатуре функции понятно, какая сущность ей нужна, assert'ы внутри функции могут быть и не видны читателю.
Нагрузка на компилятор, скорей всего, возрастёт, но в оптимизированный release run-time может выйти уже без платы.
Записан
Пока сам не сделаешь...
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Ненулевые указатели
«
Ответ #22 :
Ноябрь 12, 2019, 19:14 »
Ну в .get() проверка не нужна, так как operator= "реализован" через implicit ктор от T и уже там есть проверка, т.е. нельзя nullptr присвоить.
Я так понял, эта проверка там с давних времен и пока не убрана "как бы чего не случилось".
Так как не ясно что этот get() должен возвращать для вумных указателей - ну а вдруг там будет ссылка на вумный указатель и можно сделать .get().release()?
Так-то да,
сейчас
эта проверка просто оверхед безо всяких бонусов (так как вумные не поддерживаются до конца).
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Ненулевые указатели
«
Ответ #23 :
Ноябрь 12, 2019, 19:20 »
Цитата: ViTech от Ноябрь 12, 2019, 19:01
Т.е. уже на этапе compile-time можно многие вещи уладить, не дожидаясь, когда в run-time assert выбьет.
Я уже и не припомню, когда эти ассерты срабатывали. Ставлю их на автомате.
Вот перебираю в голове свои проекты... в основное массе мест, где точно нужен объект, используются ссылки. А в остальных местах, где используются указатели не представляю, что бы кто-то мог nullptr передать. По именам методов понятно, что например, в append( object_ptr obj ) нет нужды nullptr передавать.
А если все таки "талант" найдется, то по стеку возвратов после assert он легко находится и бьется.
Цитата: ViTech от Ноябрь 12, 2019, 19:01
И выразительность кода намного выше, по сигнатуре функции понятно, какая сущность ей нужна, assert'ы внутри функции могут быть и не видны читателю.
Да, выразительность хорошая.
Записан
ViTech
Гипер активный житель
Offline
Сообщений: 858
Re: Ненулевые указатели
«
Ответ #24 :
Ноябрь 12, 2019, 19:29 »
Цитата: Авварон от Ноябрь 12, 2019, 19:14
Ну в .get() проверка не нужна, так как operator= "реализован" через implicit ктор от T и уже там есть проверка, т.е. нельзя nullptr присвоить.
Я так понял, эта проверка там с давних времен и пока не убрана "как бы чего не случилось".
Способов сломать not_null не так уж и много. Один из - это разыменование указателя после его перемещения. Второй может связан со swap с перемещённым указателем, но это может быть и валидной операцией, по сути то же перемещение, как посмотреть. Про другие способы посильнее задуматься надо
. Но обращение к объекту после перемещение - это общая проблема, и может решаться статическими анализаторами. Когда такие созреют, assert в get можно и убрать. А сейчас он да, "на всякий случай".
Цитата: Авварон от Ноябрь 12, 2019, 19:14
Так как не ясно что этот get() должен возвращать для вумных указателей - ну а вдруг там будет ссылка на вумный указатель и можно сделать .get().release()?
Так-то да,
сейчас
эта проверка просто оверхед безо всяких бонусов (так как вумные не поддерживаются до конца).
Если честно, этот get() я бы вообще убрал
.
Записан
Пока сам не сделаешь...
ViTech
Гипер активный житель
Offline
Сообщений: 858
Re: Ненулевые указатели
«
Ответ #25 :
Ноябрь 12, 2019, 19:43 »
Цитата: Old от Ноябрь 12, 2019, 19:20
По именам методов понятно, что например, в append( object_ptr obj ) нет нужды nullptr передавать.
А если все таки "талант" найдется, то по стеку возвратов после assert он легко находится и бьется.
Имя метода, всё таки, слабоватый аргумент, тип параметра выразительнее и может обеспечить больше гарантий. Это не только к входным параметрам относится, но и к результату. Тогда и по стеку после assert'ов намного меньше придётся лазить. Не все же такие дисциплинированные, как вы
. Да и профи может устать, а компилятор ему сразу подскажет, где он не прав
.
Записан
Пока сам не сделаешь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Ненулевые указатели
«
Ответ #26 :
Ноябрь 12, 2019, 20:01 »
Цитата: ViTech от Ноябрь 12, 2019, 19:43
а компилятор ему сразу подскажет, где он не прав
.
Я только за помощь компилятора + он эти проверки может сделать эффективней меня.
Будет поддержка в компиляторе буду всеми руками использовать.
Записан
_Bers
Бывалый
Offline
Сообщений: 486
Re: Ненулевые указатели
«
Ответ #27 :
Ноябрь 28, 2019, 22:27 »
Цитата: ViTech от Ноябрь 12, 2019, 16:56
Но это совсем не отменяет полезность not_null указателей
.
и зачем он нужен?
Записан
ViTech
Гипер активный житель
Offline
Сообщений: 858
Re: Ненулевые указатели
«
Ответ #28 :
Ноябрь 29, 2019, 11:55 »
Цитата: _Bers от Ноябрь 28, 2019, 22:27
Цитата: ViTech от Ноябрь 12, 2019, 16:56
Но это совсем не отменяет полезность not_null указателей
.
и зачем он нужен?
А
затем
.
Записан
Пока сам не сделаешь...
_Bers
Бывалый
Offline
Сообщений: 486
Re: Ненулевые указатели
«
Ответ #29 :
Ноябрь 29, 2019, 23:43 »
Цитата: ViTech от Ноябрь 29, 2019, 11:55
А
затем
.
ну и зачем нужно такое "затем"?
если ожидается работа с реальным объектом,
тогда нужно использовать ссылку, а не указатель.
зачем изобретать указатель, который делает вид,
что он ссылка?
Записан
Страниц:
1
[
2
]
3
4
5
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...