
Constantine
19.07.2018
22:31:34
Ничто не мешает variant<enum1, enum2, ...> где enum имеет underlying type int32_t быть структурой с одним int64_t
Ничто не мешает написать enum_variant

Dmitry
19.07.2018
22:32:46

Constantine
19.07.2018
22:33:01
Тем более, что частный случай variant под названием optional есть в стандарте

Google

Constantine
19.07.2018
22:33:57
Я вот не знаю, почему optional<T&> не определен как T*, а optional<std::vector> не хранится во внутреннем состоянии vector
Но это к комитету

Dmitry
19.07.2018
22:40:36

Constantine
19.07.2018
22:49:48
Т.е. его внутреннее состояние не полное

Dmitry
19.07.2018
22:50:54

Constantine
19.07.2018
22:51:16

Dmitry
19.07.2018
22:51:28
Который кстати может не иметь default конструктора.

Constantine
19.07.2018
22:51:39
Это никак не связано с обсуждением
Вектор хранит три указателя
И эта тройка имеет не полное множество значений

Google

Constantine
19.07.2018
22:52:26
Это значит, что его пополнение возможно через некорректное состояние
Мне не нужно для этого нарушать требование optional не вызывать конструктор
Я знаю, что если объект сконструирован, то вот тут лежит либо три нуля, либо три не нуля
Так что мне не нужно хранить дополнительный параметр для проверки, что объект сконструирован

Dmitry
19.07.2018
22:55:14
Так. Чего то не понимаю. Предполагается в специализации для вектора в optional хранить сам вектор потому что у него есть "пустое" состояние?

Constantine
19.07.2018
22:55:52
Предлагается делать sizeof(optional<vector>) == sizeof(vector)

Dmitry
19.07.2018
22:56:45
Это не одно и то же. Немножко json:
"arr":null vs "arr":[]

Constantine
19.07.2018
22:57:31
Вы же понимаете, что я не собираюсь нарушать логику работы optional?

Dmitry
19.07.2018
22:58:48
А, использовать знание потрохов вектора чтобы хранить состояние невозможной комбинацией?

Constantine
19.07.2018
22:59:04
Именно

Dmitry
19.07.2018
23:03:21
Через traits запилить impossible_instance? :)
optional_traits<T>::constuct_null(void*)
Ещё кстати на уровне библиотеки может неплохо бы приделать какие то enum_traits с sorted массивом пар <Enum, string_view>. Тогда можно было бы в runtime enum валидировать, to/from string всякие задешево.

Побитый
19.07.2018
23:09:07

Dmitry
19.07.2018
23:09:50

Побитый
19.07.2018
23:10:37

Dmitry
19.07.2018
23:11:55

Constantine
19.07.2018
23:13:21

Google

Dmitry
19.07.2018
23:13:24
Например записать единичку в то место где должен быть указатель любой.

Constantine
19.07.2018
23:13:54
Там нет ни малейшего смысла делать не так

Dmitry
19.07.2018
23:14:46
Только это уже будет не constexpr наверное.
Хотя bit_cast же :)

Matway
19.07.2018
23:28:48

Dmitry
19.07.2018
23:31:57

Constantine
19.07.2018
23:32:05

Matway
19.07.2018
23:33:02
Какое это имеет отношение к утвержденимю "любая реализация хранит три указателя"?

Constantine
19.07.2018
23:33:38
дальше не читал

Dmitry
19.07.2018
23:34:19
Для получения невалидного состояния достаточно одного указателя с ненулевым младшим битом например.

Matway
19.07.2018
23:34:21

Constantine
19.07.2018
23:34:53
Если вы пользовались MSC 7.1, то знали бы их имена

Alex Фэils?︙
19.07.2018
23:35:17

Matway
19.07.2018
23:35:54
Оно конечно cliext/vector, но речь изначально шла про то, что таких реализаций нет вообще.

Stanislav
19.07.2018
23:37:19

Constantine
19.07.2018
23:38:05

Google

Matway
19.07.2018
23:38:06

Constantine
19.07.2018
23:38:24
CLI это вообще про другой язык программирования
и да, просьба в качестве примера реализации гениев, у которых крашится
v.push_back(std::move(v[0]));
не приводить)

Alex Фэils?︙
19.07.2018
23:40:22

Constantine
19.07.2018
23:41:10
ой, нахер так делать
нахрена делать это UB - спроси у автора
https://github.com/lnishan/vector/blob/master/vector.hpp#L451

Alex Фэils?︙
19.07.2018
23:41:47
ой, сложна, ну нахер, пойду лучше спать

Matway
19.07.2018
23:41:59

Constantine
19.07.2018
23:42:15

Dmitry
19.07.2018
23:47:32

Constantine
19.07.2018
23:47:48
Собираетесь написать vector, который 2^32 на x64 не умеет?
Ради 8 байт?

Vladislav
19.07.2018
23:48:23

Dmitry
19.07.2018
23:48:26
А почему бы и нет
Стандарт разрешает :)

Constantine
19.07.2018
23:49:03
И чем это поможет?
Там если ссылка в диапазоне, через индекс элемента идет. Т.е. реалокация и перемещение элемента по индексу

Dmitry
19.07.2018
23:50:50

Vladislav
19.07.2018
23:51:21

Google

Vladislav
19.07.2018
23:51:37
Давай уж тогда обязательный gc сразу

Constantine
19.07.2018
23:51:41
Оверхед в случае реаллокации в виде двух вычислений, серьезно? Там операция в два порядка дольше

Vladislav
19.07.2018
23:52:33

Constantine
19.07.2018
23:52:58
Т.е. оверхед + log N
Вообще смешной товарищ, делает реаллок х4 и рассказывает, что у него в два раза быстрее стандартной реализации при запихивании 10^7 элементов без резерва

Alex Фэils?︙
19.07.2018
23:56:56
а я могу сделать вектор, в котором бесплатная реаллокация для такого случая!
vector<T> {
T inner_array[10'000'000];
....
};

Constantine
19.07.2018
23:57:28
Что реаллок x4 приводит к оверхеду в 4 раза (а не в 3, еще 1 за фрагментацию при >= x2) он, видимо, даже догадывается :)

Alex Фэils?︙
20.07.2018
00:01:16
пес знает, я уже не соображаю

Dmitry
20.07.2018
00:01:45
А что за гарантии?

Constantine
20.07.2018
00:05:47
А, там все наоборот, все поломали

Dmitry
20.07.2018
00:15:45
Не хватает явного запрета swap через allocator traits. Тогда бы и без UB обошлось. Просто не компилировалось бы например.
А, ну хотя если его сделать noncopyable, это же оно и будет.

Konstantin
20.07.2018
03:42:52

Alexander
20.07.2018
05:06:32
http://www.opennet.ru/opennews/art.shtml?num=48990