LINUX.ORG.RU

Move конструктор для POD (структур на стеке)

 


0

6

Допустим стуктуру данных

template <size_t n>
struct Foo {
    char buffer[n];
};

Вопрос такой: имеет ли смысл писать move конструктор для такого типа данных? Если да, то как он будет выглядеть? И принесет ли он (конструктор) какой-либо профит?

★★★★★

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

что и откуда ты тут собрался мувнуть?

anonymous
()

Move конструктор и присваивание имеют смысл только когда есть более дешёвый (и обычно деструктивный для исходного объекта) метод инициализации (ну или концептуально объект копировать нельзя, а перемещать можно). А здесь как ни крути будет побайтное копирование.

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

Я вот тоже так думаю. Но все же решил спросить, вдруг что-то упускаю.

Спасибо за ответ.

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

Не имеет, хотя компилятор его и так сделает если будет нужно.

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

У меня ощущение, что их целый выводок: ну не может один человек столько мониторить. Он ведь должен кушать и испражняться, как минимум.

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

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

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

никто использовать не заставляет

Доцент^W Исключения заставят.

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

У меня ощущение, что их целый выводок: ну не может один человек столько мониторить.

Сколько? Я пишу раз в тысячу лет. Никаких нет проблем зайти раз в день и посмотреть темы, особенно в этом мёртвом разделе. Вменяемые темы тут рождаются от силы раз в неделю.

В конечном итоге лор превращается в бложик убогих и обиженных жизнью балаболов, у которых в жизни остались их звёзды и чувство превосходства над зелёными, новыми/старыми пользователями.

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

Но тут такая возможность - лор, почитатели. Тебя считаю сишником, железячником и профессионалом. Ведь 5звёзд не просто так. Позёры уже сами начали верить то, что они что-то из себя представляют.

А тут прихожу я, а возможно ещё кто-то типа меня. И где все эти сишники? Где все эти эксперты? Кто им сейчас верит? Никто. И естественно у них банальная реакция - уничтожить раздражитель, либо подменять его под себя.

Прошлые цепные псы лсной цензуры меня мониторили 24/7 - где они сейчас? В забвении. Этот персонаж укатиться туда же, либо сам, либо когда мне надоест это терпеть.

Лор мог стать реально площадкой профессионалов, а не убогих позёров и жополизов. Жиль, что он этим не стал. Убогая помойка. Вам самим-то не надоело жрать это дерьмо?

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

Кстати, этот позёр уже успел меня забанить. Насколько же жалки и убоги эти потуги.

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

tl;dr да,да, который месяц ты бегаешь по dev с горящей жопой и сообщаешь как мы тебе безразличны

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

Но тут такая возможность - лор, почитатели.

Вот :-) Вот вчера было написано, как в цепепе плохи дела с иерархиями классов с данными в сочетании с копирующими/перемещающими операторами присваивания :-) Даже привёл пример: пусть есть класс Parent и классы Child1, Child2 :-) Тогда лажа налицо:

void f(Child1& child1)
{
  Parent& parent = child1;
  parent = Child2();
}
А говорили, мол, объектно-ориентированный :-) Безопасный :-) Даже иерархию классов без проблем не сделать :-) Лол :-)

anonymous
()

Передача владения чем-то. «Мувать» можно владение памятью, открытыми дескрипторами или токенами.

pathfinder ★★★★
()
Ответ на: комментарий от anonymous
  Parent& parent = child1;
  parent = Child2();

Не скомпилируется, если только в Parent не обьявлен копирующий оператор =. И все равно Parent сам из себя не может сделать Child2.

Если ты хотел сука зателями сделать — то проконало бы. Однако не вижу ничего плохого в кастовании к базовому типу. Это есть полиморфизм. А вот кастование вниз по иерархии необходимо делать осторожно.

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

Не скомпилируется, если только в Parent не обьявлен копирующий оператор =. И все равно Parent сам из себя не может сделать Child2.

Что ты несёшь? :-) Лол :-) На вот тебе, компиль и познавай :-)

#include <assert.h>

struct Parent {
  Parent(int number) : number_{number}{}

  int number_{-1};
};
struct Child1 : Parent { Child1() : Parent(1) {} };
struct Child2 : Parent { Child2() : Parent(2) {} };

void f(Child1& child1)
{
  Parent& parent = child1;
  parent = Child2();
}

int main(int argc, char** argv)
{
  Child1 child1;
  assert(child1.number_ == 1); // Ok
  f(child1);
  assert(child1.number_ == 2); // Ok :-) (Surprise for lamers) :-)

  return 0;
}

:-) Цепепе он такой :-)

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

Ладно, согласен, я провтыкал сгенерированный компилятором конструктор/оператор копирования.

Но все равно обьект Child1 не «превращается» в Child2. Или что ты там хотел доказать?

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

Но все равно обьект Child1 не «превращается» в Child2. Или что ты там хотел доказать?

Последствия ещё хуже, чем превращение с т.з. dynamic_cast :-) Здесь представлением объекта типа Child1 становится представление объекта типа Child2 :-) И хотя Child1 выглядит как Child1, внутренности там уже от Child2 :-) Цепепе, однако :-)

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

И хотя Child1 выглядит как Child1, внутренности там уже от Child2 :-)

Точнее, та часть состояния Child1, которая унаследована от Parent :-)

anonymous
()

А ведь Царь прав, ТС вообще ничерта не понимает. Move-конструктор для POD, объекты друг в друга «превращаются», офигеть вообще.

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

И в чем проблема? Parent поменял состояние (значение) из одного валидного в другое. Или как по твоему это должно быть?

Опять же: я никак не пойму что ты там пытаешься доказать.

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

И в чем проблема? Parent поменял состояние (значение) из одного валидного в другое. Или как по твоему это должно быть?

Разве не понятно, что у Child1 и Child2 могут быть совершенно разные инварианты? :-) Поэтому присваивание объекта типа Child2 объекту, преобразованному из типа Child1, некорректно в принципе :-) После того, как цепепе без проблем позволяет это сделать после неявного преобразования из Child1 в Parent, инвариант для Child1 больше невалиден :-)

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

не, насчёт ООП и «безопасности» плюсов слухи сильно преувеличены.

плюсы дают возможности, но ничего не ограничивают и не навязывают программисту. это не ООП, не функциональщина. это просто набор средств, с помощью которых можно и то, и другое, и третье. конечно, если понимаешь, что делаешь. в плюсах нет защиты от дурака. там также разрешается выстрелить себе в ногу, как и в С.

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

Походу, ты кайфуешь с этих мантр.

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

просто набор средств, с помощью которых можно и то, и другое, и третье. конечно, если понимаешь, что делаешь. в плюсах нет защиты от дурака. там также разрешается выстрелить себе в ногу, как и в С.

Возникает вопрос :-) Тогда зачем вообще нужен цепепе? :-)

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

универсальный язык. надстройка над С, чтобы можно было код чуть быстрее писать. ну и сам код сокращается визуально (например, за счёт темплейтов), хотя физически на выходе компилятора ничего не меняется и кода меньше не становится, просто часть рутины сваливается на компилятор. также в нём есть некоторые опасные вещи, которые могут спровоцировать неоптимальный код. просто нужно знать некоторые тонкости. если их понимать, то эффективность кода на плюсах практически такая же, как на С.

кстати, move есть одна из фич, аналогов которой в С нет. именно на уровне компилятора. когда готовился стандарт, я читала все обоснования и читала развесистую статью по реализации move в компиляторах. и таки да, иногда там можно выжать даже чуть больше, чем в простом С. хотя разница эта будет практически незаметна, но всё-таки это так.

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

Поэтому присваивание объекта типа Child2 объекту, преобразованному из типа Child1, некорректно в принципе :-)

Да ладно? Почему?

Кстати, я согласен с Iron_Bug выше. Программируй так, как тебе надо, благо есть возможность.

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

Да ладно? Почему?

Потому что некорректно присваивать вафлям табуретки :-) Странно, что тебе, обладателю 5-ти звёзд на ЛОРе приходится это пояснять :-)

Кстати, я согласен с Iron_Bug выше. Программируй так, как тебе надо, благо есть возможность.

На localhost - благо :-)

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

Странно, что тебе, обладателю 5-ти звёзд на ЛОРе приходится это пояснять :-)

www.linux.org.ru/help/rules.md
Необходимо уточнить, что ни в коем случае не следует рассматривать рейтинг как показатель некой личной крутизны. Это лишь показатель активности человека на форуме.

Так что давай, не стесняйся.

На localhost - благо :-)

Ну а когда в Ънтерпрайзе наговнячиш из-за «ололо, плохой обьектной иерархии», то исправлять еще и придётся.

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