Здравствуйте, Pzz, Вы писали:
Pzz>>>!! — это, в некотором смысле, идеоматическое выражение, и компилятор его, скорее всего, знает, и соптимизирует. Я вот !~ — это экзотика, и компилятор вряд ли будет его оптимизировать. AD>>Ой, да что тут оптимизировать? not, jz. Это "!= -1" как раз должен оптимизироваться в !~. Pzz>Ну, например, если оно в if'е стоит, то очень вероятно, что можно обойтись без nоt'a.
Можно загрузить 0xffffffff и проверить and или cmp, но меньше, чем через not, не нагенеришь кода.
Здравствуйте, _pk_sly, Вы писали:
__>Всем привет!
__>Кто как относится к использованию таких, как бы, операторов в C++ как "!!", "&*" и подобных? (а кстати, каких?)
нормально, они привычные, хотя и постепенно уходят из употребления
~0, ^ — тоже ничего так, полезненько
скоро будет еще и <=>
Здравствуйте, Nikе, Вы писали:
__>>Ну или вот &*. Есть у нас любого вида smart pointer. Для примера возьмём unique_ptr. Для того, чтобы программист не запутался, неявная конверсия — запрещена. Зато, есть оператор *. N>get лучше, так как разыменование нулевого указателя — это UB. На практике конечно работало.
Чем get будет лучше ?
Здравствуйте, _NN_, Вы писали:
N>>get лучше, так как разыменование нулевого указателя — это UB. На практике конечно работало. _NN>Чем get будет лучше ?
Здравствуйте, Nikе, Вы писали:
N>Здравствуйте, _NN_, Вы писали:
N>>>get лучше, так как разыменование нулевого указателя — это UB. На практике конечно работало. _NN>>Чем get будет лучше ?
N>Это официальный способ и без уб.
&* такой же официальный способ.
А каким образом нет неопределенного поведения ?
Здравствуйте, _NN_, Вы писали:
N>>Это официальный способ и без уб. _NN>&* такой же официальный способ.
Нет.
_NN>А каким образом нет неопределенного поведения ?
Не распарсил.
_NN>
Здравствуйте, _NN_, Вы писали:
_NN>Разницы нет, что и требовалось доказать.
Разыменование невалидного указателя это UB. В операторе * ты делаешь это. UB означает, что ситуация может быть развиваться так как ты ожидаешь, но может и диск отформатировать.
Нашёл такой пример:
struct S { int some_field; };
void do_something(S* p)
{
// Несмотря на то, что мы всего лишь берём адрес поля,
// а не обращаемся к его значению -- формально мы выполняем разыменование,
// т.е. в случае p == nullptr имеем UB.int *field_ptr = &p->some_field;
// ...
// Т.к. выше в случае p == nullptr имеем UB, компилятор может
// оптимизировать код с предположением, что p != nullptr (для случая без UB!)
// и убрать эту проверку как лишнюю.if (p != nullptr)
{
// Код в этом блоке может быть выполнен даже если p == nullptr.
// ...
}
}
Здравствуйте, Nikе, Вы писали:
N>Здравствуйте, _NN_, Вы писали:
_NN>>Разницы нет, что и требовалось доказать.
N>Разыменование невалидного указателя это UB. В операторе * ты делаешь это. UB означает, что ситуация может быть развиваться так как ты ожидаешь, но может и диск отформатировать.
Хорошо, а чем в этом плане отличается функция 'get' ?
*a.get() также может разыменовывать невалидный указатель.
Здравствуйте, _NN_, Вы писали:
_NN>Хорошо, а чем в этом плане отличается функция 'get' ?
Тем что она не содержит UB преобразуя умный указатель в обычный.
_NN>*a.get() также может разыменовывать невалидный указатель.
Это уже будет UB, но оно будет на совести пользователя.
__>Кто как относится к использованию таких, как бы, операторов в C++ как "!!", "&*" и подобных? (а кстати, каких?)
__>У меня на работе возник спор. Мои коллеги, опытные С++ программисты, сказали мне, что они смотрят на эти знаки в упор и вообще не понимают, что это такое.
опытные программисты насиженное место, job security...
__>Наверняка есть и другие удобные штуки, но этими я пользуюсь постоянно.
__>Как думает сообщество, действительно ли это — какая-то нечитаемая непонятная хрень, которой не стоит пугать людей или же нормальная техника C++?