@ProCxx

Страница 2215 из 2477
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
Я вот не знаю, почему optional<T&> не определен как T*, а optional<std::vector> не хранится во внутреннем состоянии vector
Первое вполне реализуемо, просто наверное никто не использует optional<T&> как замену T*. А второе уже не так просто, инстанциирование аллокатора может иметь side effects например.

Это вопрос реализации, полагаю, там ничего не ограничивает её, кроме как мордой
Какая то базовая реализация http со стандартным набором статусов и пользовательское расширение. Естественно базовая реализация о расширении не знает, это её и ограничивает.

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

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":[]

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
Вектор хранит три указателя
Просвети, пожалуйста, что это за три указателя?

Побитый
19.07.2018
23:10:37
begin, end, begin + capacity
А, ну да, логично) Ток я так понимаю это какая то конкретная реализация?

Dmitry
19.07.2018
23:11:55
А, ну да, логично) Ток я так понимаю это какая то конкретная реализация?
Так и optional конкретная реализация, а через traits подобное поведение можно приделать кому угодно.

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
Я так понимаю, это любая реализация
Как насчёт https://github.com/lnishan/vector ?

Dmitry
19.07.2018
23:31:57
Как насчёт https://github.com/lnishan/vector ?
new в default конструкторе? Ффууу. Ещё и для получения end что то складывать?

Constantine
19.07.2018
23:32:05
Как насчёт https://github.com/lnishan/vector ?
Учитывая, что sizeof(size_t) ну наверняка равен sizeof(ptrdiff_t), который ну наверняка равен sizeof(T*) автор упоролся

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

Constantine
19.07.2018
23:33:38
Какое это имеет отношение к утвержденимю "любая реализация хранит три указателя"?
Ну я могу написать реализацию, храня четыре инта, я почти уверен, что любая реализация уровня std будет так делать

Как насчёт https://github.com/lnishan/vector ?
https://github.com/lnishan/vector/blob/master/vector.hpp#L451

дальше не читал

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

Matway
19.07.2018
23:34:21
Ну я могу написать реализацию, храня четыре инта, я почти уверен, что любая реализация уровня std будет так делать
Я сейчас смотрю у себя на машине "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26428\include\cliext\vector". Там тоже не указатели. Это недостаточно std-уровня реализация?

Matway
19.07.2018
23:35:54
В реализации MSC ТОЧНО три указателя
Прошу проследовать по указанному пути, если установлена студия 2017.

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

Constantine
19.07.2018
23:38:05


Google
Matway
19.07.2018
23:38:06
тебя не напрягло что это C++/CLI ?
Если бы исходное утверждение звучало как "любая реализация, кроме расширений CLI" - напрягло бы =)

Constantine
19.07.2018
23:38:24
CLI это вообще про другой язык программирования

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

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
и да, просьба в качестве примера реализации гениев, у которых крашится v.push_back(std::move(v[0])); не приводить)
Не запускал. Кинул первую попавшуюся ссылку, соответствующую утверждению. Триггеред на излишне безапелляционное утверждение, короче.

Constantine
19.07.2018
23:42:15
ой, сложна, ну нахер, пойду лучше спать
ниче сложного, push_back(T&& val) должен в случае реаллокейта проверять std::addressof(val) на диапазон

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

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

Ради 8 байт?

Dmitry
19.07.2018
23:48:26
А почему бы и нет

Стандарт разрешает :)

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

Стандарт разрешает :)
Да потому что экономить 8 байт структуры не имеет смысла почти никогда

Dmitry
19.07.2018
23:50:50
Да потому что экономить 8 байт структуры не имеет смысла почти никогда
Но изначально речь как раз об экономии флага в optional :)

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

Constantine
19.07.2018
23:51:41
Эм, вносить оверхед всем дабы обезопасить не умеющих в ub?
Там нет оверхеда, и, вроде, это требование стандарта

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

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
А, там все наоборот, все поломали

А что за гарантии?
http://eel.is/c++draft/container.requirements.general#9

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

Страница 2215 из 2477