Формализация обменов и релокации (предварительно)

webreh
webreh

Предлагается добавить операцию обмена как встроенную в язык. Релокацию предлагается считать формой этой операции, при которой обмен производится с областью памяти, в которой не находится объекта.

Указание = default для операции в форме relocate подразумевает и указание = default для операции обмена (пункт 3 ниже).

Мысли на подумать:

Note. This text refers to all concepts (including Relocatable and TriviallyRelocatable) as a 'natural' type property, not as they are defined by P1144R4 or by the standard.

1. swap should not be understood as a move construction, two move-assignments, and a destroy. Not every Swappable is MoveConstructible. Also, not every TriviallyRelocatable is MoveConstructible (see below).
2. every Relocatable is Swappable (implement swap with 3 relocations)
3. every TriviallySwappable (that is: object may be swapped by swapping its binary representation) is TriviallyRelocatable (Implement relocation as a trivial swap with zero-initialized memory and optimize the memory initalization out)
4. not every Swappable is Relocatable
5. under some assumptions every Destructible MoveConstructible Swappable is Relocatable (see below)

Consequencies:
(1) and (4) imposes both swap and relocate as basic operators and triviality as a property of that operator.

Below:

1. Imagine not_null_unique_ptr<T> class that is similar to unique_ptr<T> but does not provide user-defined _Deleter and never holds the nullptr value. It can be trivially swapped (e.g. with 3 memcpy), it can be trivially relocated. It is not MoveConstructible as it can neither create a new value nor left the rhs value as nullptr.

4. You can swap inner lists of callbacks_list instances. You can not relocate callback_list as you're conventionally not allowed to invalidate references to callbacks_list (callbacks_list is not Destructible).

5. Here T{__movedout_tag} constructs the object exactly in a state it is left after calling a move ctor

T * reallocate(T * current, size_t n, size_t new_size) {
   T * x = allocate(new_size);
   for (auto i : indices(n))  {
       T & y = *new (x + i) T{__movedout_tag};
       y <~> current[i];
       current[i].~T();
   }
   return x;
}

We assume we can omit T y{__movedout_tag} t; followed by y.~Y() as copy/move elision does exactly the same.

0
рейтинг
7 комментариев
Никита Колотов

В этом предложении никак не поясняется, какие эффекты должны быть у предлагаемой операции обмена, и какие преимущества должно принести встраивание ее в язык. Даже не понятно, предлагается ли такая операция как замена обычным swap или как нечто отличное.

В конце присутствует пример reallocate, однако он не особо проясняет ситуацию. Там написано "we can omit T y{__movedout_tag} t; followed by y.~Y()", но в приведенном примере этого же и не было. Или, может быть, там имеется в виду, что внутри цикла остается только y <~> current[i]; (то бишь только предлагаемая встроенная операция обмена)? За счет чего оно будет работать как copy/move elision? Ведь при copy/move elision оптимизация достигается за счет создания объекта сразу с использованием места, отведенного под конечный объект, а в этом случае на вход подаются уже созданные объекты, размещенные в собственной памяти.

Никита Колотов
Андрей Руссков

Никита Колотов, подразумевалось, что вы знаете что имеется в виду под "релокацией" и, соответственно, все её достоинства.

По сути своей, релокация - тривиальное копирование памяти и замена this в качестве замены операции move. Она оптимизирует move out рутину (например, для std::string это будет зануление указателя на data) и деструктор moved-out объекта (для std::string это будет проверка с попыткой delete ранее зануленного указателя на data).

Андрей Руссков
Andrey

Андрей Руссков, я думаю, что Никита Колотов знает идею "релокации", при этом замечание, что предложению не хватает контекста совершенно справедливо. Что за "callbacks_list"из пункта 4, скажем?

Топикстартер писал относительно wg21.link/p1144 однако, как минимум из активных сейчас (или в недавнем прошлом?) предложений есть еще wg21.link/p1029, а автор p1144 посвятил целую статью разнице его предложения и destructive move (wg21.link/n4158).

Так что мне кажется, если цель вывешивания предложения на этот сайт в том, чтобы получить feedback от остальных посетителей, стоит переписать предложение так, чтобы было понятно о чем идет речь и дать побольше контекста. Описать какие проблемы автор видит в конкурирующих предложениях и, соотвественно, как его идея помогает справиться с ними, при этом продолжив работать во всех остальных рассматриваемых use cases.

Andrey
Никита Колотов

Андрей Руссков, Скажем так, под релокацией обычно имеется ввиду relocation, а до четкого закрепеленного понятия релокации объектов в С++ еще далеко. Так что имеет смысл детально пояснять свойства предлагаемых операций релокации и обмена. Особенно обмена. Как я уже написал выше, из этого предложения не ясно, подразумевается ли тут операция обмена как swap, или как нечно отличное.

Никита Колотов
Обновлено 
webreh

Никита Колотов, я соглашусь, что подразумевается операция обмена как swap, как только вы объясните, что такое swap.

webreh
webreh

Andrey, этот текст изначально написан как отзыв на 1144. Уже после написания текста была найден очень забавный вопрос о том, как вообще понимается MoveCtor (возможно, вы принимали участие в этом) и почему в действующем языке уже не существует разрушающее перемещение.
Касательно 1029 - если я правильно читал, это попытка реализации reallocate из пункта 5, с заменой T{__movedout_tag} на T{}, причем только для тривиального случая.

webreh
Никита Колотов

webreh, так вы сами в этом предложении описываете swap: "1. swap should not be understood as a move construction...". Так вот тут не ясно - описываемый swap - вы называете операцией обмена, или все-таки нет?

Никита Колотов
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения