LINUX.ORG.RU

Уникальный умный указатель без семантики копирования/перемещения

 


0

7

Есть ли в стандартной библиотеке класс указателя для уникального владения, но без семантики перемещения? Ищу замену, к примеру, такому коду:

class A {
public:
  A() { d = new AImpl; }
  ~A() { delete d; }
};

unique_ptr для такой задачи избыточен: имеет семантику перемещения, хранит deleter, выполняет лишнюю проверку в рантайме на валидность указателя.

Нужно буквально нечто такое:

template <typename T>
class Ref {
public:
  Ref(T & r) : r(r) {}
  ~Ref() { delete &r; }
  T & r;
};
★★★★★

Последнее исправление: Dendy (всего исправлений: 2)

Нет. std::unique_ptr и так очень дешёвый. Дешевле его ничего в стандартной библиотеке нет: std::shared_ptr дороже намного(оно и понятно), std::weak_ptr к нему же.

ЕМНИП, в Boost тоже ничего такого сверхдешёвого нет. Будет проще накатать по-быстрому свой ultraFastSmartPtr<T>. Только лично я не вижу в этом смысла.

zamazan4ik ★★
()
Последнее исправление: zamazan4ik (всего исправлений: 1)
Ответ на: комментарий от zamazan4ik

Есть такое понятие преждевременная пессимизация кода, это как раз тот случай. Но главный смысл даже в другом — дело в семантике. Когда я вижу unique_ptr, то понимаю, что его можно перемещать, что он может быть нулевой и т.п. Здесь же семантика уникального владения на этапе создания и невозможность иметь невалидное значение. Первое в принципе можно заменить на const unique_ptr, а вот со вторым никак, видимо только писать свой класс.

Dendy ★★★★★
() автор топика
Ответ на: комментарий от Gvidon

Семантика владения ресурсом, точнее её отсутствие.

Dendy ★★★★★
() автор топика

http://www.boost.org/doc/libs/1_61_0/libs/smart_ptr/scoped_ptr.htm

почти то, что тебе надо. но у него есть reset().

anonymous
()

Умные указатели ведь так и спроектированы, что речь больше идёт о владении объектом (а следовательно передаче владения и т.д.), нежели просто RAII. Так что только самописный dumb_ptr

jeuta ★★★★
()
Последнее исправление: jeuta (всего исправлений: 1)

Да, его можно перемещать, и что? Ты не платишь за то что не используешь. Если не использовать свой делитер, то он ничего не хранит и весит всё те же 4/8 Байт. Я почти уверен, что большинство кода с ним инлайнится и бесплатно. Плюс я давно им пользуюсь в больших количествах, проблем не замечено.

Deleted
()
Ответ на: комментарий от legolegs

А почему нельзя так?

Потому что forward declaration.

Dendy ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Выше написал, что вопрос в семантике. И про бесплатно тоже написал, как минимум одна абсолютно бесполезная проверка есть, нарушающая предсказание ветвлений ЦПУ.

Dendy ★★★★★
() автор топика
Ответ на: комментарий от Dendy

лол. ты пишешь бенчмарк умных указателей?

anonymous
()
Ответ на: комментарий от Dendy

Хочу примеров, где это имеет значение. Более того, я считаю что компилятор способен выкинуть эту проверку.

Deleted
()
Ответ на: комментарий от Deleted

В принципе да, для const unique_ptr эта проверка может быть выкинута, если умный указатель создаётся и удаляется в пределах одной единицы трансляции.

Dendy ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.