Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Тёмчик Австралия жж
Дата: 02.01.21 16:32
Оценка: :))) :))) :))) :))
С++11 emplace_back
std::vector<int> v;
v.emplace_back(123);
v.emplace_back(v[0]);

Думаете, результат будет [123, 123]? Think again.

С++11 std::make_unique, std::make_unique_for_overwrite
Constructs an object of type T and wraps it in a std::unique_ptr.
The function is equivalent to:
unique_ptr<T>(new T(std::forward<Args>(args)...))


std::forward

Forwards lvalues as either lvalues or as rvalues, depending on T


ЭЭЭЭ что???!!

И все эти приседания из-за того, что такое вот приведёт к утечке памяти.
abc(std::unique_ptr<A>(new A()), std::unique_ptr<A>(new A()), some_other_function())


В до C++ 11-е времена было нормально написать так:
std::auto_ptr<A> a1 = std::auto_ptr<A>(new A());
std::auto_ptr<A> a2 = std::auto_ptr<A>(new A());
abc(a1.get(), a2.get(), some_other_function())


Но авторам новых фич показалось мало треша и угара, auto_ptr выпилен, ибо захотелось коллекций с умными указателями.

Only non-const unique_ptr can transfer the ownership of the managed object to another unique_ptr. If an object's lifetime is managed by a const std::unique_ptr, it is limited to the scope in which the pointer was created.

Т.е. если
auto a1 = std::unique_ptr<A>(new A());
auto a2 = std::unique_ptr<A>(new A());
abc(a1, a2, some_other_function())

a1.get() // null ptr


abc() может внутри написать
std::unique_ptr<A> myA1 = a1;

И этим разрушить объект в a1.




C++20 std::to_address

Obtain the address represented by p without forming a reference to the object pointed to by p.





Можно потратить всё время на обдумывание этих слоёв грабель, вместо оптимального решения задачи.
Re: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: reversecode google
Дата: 02.01.21 17:07
Оценка: +8 :))
никогда больше не ходите на бокс
Re: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: T4r4sB Россия  
Дата: 02.01.21 17:14
Оценка:
Здравствуйте, Тёмчик, Вы писали:

Это фича, ты не понимаешь
Re: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 02.01.21 18:09
Оценка: +1
Здравствуйте, Тёмчик, Вы писали:

Тё>С++11 emplace_back

Тё>
Тё>std::vector<int> v;
Тё>v.emplace_back(123);
Тё>v.emplace_back(v[0]);
Тё>

Тё>Думаете, результат будет [123, 123]? Think again.

Слушай, а что будет? Я проверил на Ideone, всё норм.
Re[2]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: watchmaker  
Дата: 02.01.21 18:43
Оценка: 24 (12) +6
Здравствуйте, Nuzhny, Вы писали:

N>Здравствуйте, Тёмчик, Вы писали:


Тё>>С++11 emplace_back

Тё>>
Тё>>std::vector<int> v;
Тё>>v.emplace_back(123);
Тё>>v.emplace_back(v[0]);
Тё>>

Тё>>Думаете, результат будет [123, 123]? Think again.

N>Слушай, а что будет? Я проверил на Ideone, всё норм.


С++ гарантирует, что будет вектор из двух элементов [123, 123]. Релевантная ссылка: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#526

Но это хороший тест, на котором ломаются многие самодельные аналоги std::vector.

В них относительно часто встречается наивная реализация вставки, устроенная примерно так:
1. Проверить size() < capacity(). Если выполнено перейти к пункту 3.
2. Позвать reserve(size() × 2)
3. Вызвать in-place конструктор для нового элемента по смещению size();
4. Сделать ++size;

где reserve работает так:
1. Выделяет новый буфер;
2. Переносит в него элементы из текущего буфера;
3. Разрушает элементы в старом буфере и освобождает память;



При аккуратном рассмотрении, видно, что если аргумент emplace_back (или push_back) ссылался на собственный элемент вектора и если при его вставке произошла реаллокация, то после пункта 2, элемент, который нужно было скопировать и вставить, окажется уже разрушенным. И вставлять станет нечего.
(и даже говорят, в некоторых древних версиях STL встречался этот баг)
Надёжный std::vector написать сложно :)


На самом деле в реализациях std::vector приходится учитывать множество подобных нюансов, которые не должны приводить к несогласованному состоянию когда подобный код напишут или когда во время переноса одного из элементов вылетит исключение.


ЗЫ. Если интересно, часто эту проблему решают так: при реаллокации сначала выделяют новый буфер, создают в нём сразу новый элемент, и лишь затем переносят в новый буфер старые элементы. То есть в emplace_back нельзя использовать reserve непосредственно, и нужно элементы обрабатывать в особом порядке (сначала новый, потом старые, а не наоборот), что при первом прочтении выглядит немного странным.
Отредактировано 04.01.2021 20:33 watchmaker . Предыдущая версия . Еще …
Отредактировано 04.01.2021 20:32 watchmaker . Предыдущая версия .
Отредактировано 02.01.2021 19:01 watchmaker . Предыдущая версия .
Отредактировано 02.01.2021 18:50 watchmaker . Предыдущая версия .
Re[2]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Тёмчик Австралия жж
Дата: 02.01.21 18:47
Оценка: 1 (1)
Здравствуйте, Nuzhny, Вы писали:

N>Слушай, а что будет? Я проверил на Ideone, всё норм.


Проверил на ideone — нормально. language:C++ (gcc 8.3).

https://stackoverflow.com/a/28435599

Some library implementations of emplace_back do not behave as specified in the C++ standard including the version that ship with Visual Studio 2012, 2013 and 2015.

The call to emplace_back() uses perfect forwarding to perform construction in place and as such v[0] is not evaluated until after the vector has been resized (at which point v[0] is invalid). push_back constructs the new element and copies/moves the element as needed and v[0] is evaluated prior to any reallocation. – Marc Mar 6 '15 at 16:01

Отредактировано 02.01.2021 19:03 Артём . Предыдущая версия .
Re: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: reversecode google
Дата: 02.01.21 21:01
Оценка:
пользуясь случаем хочу поинтересоваться у покалеченного С++ магистра черных сил
если жопаскрипт такое быстрое г
то почему везде где оно используется как правило отжирает у броузера ~%40 cpu ?
а при открытии страницы минуту может тупо висеть

вот прямо сейчас что бы далеко не ходить

биржа ексмо https://exmo.com/uk/trade/BTC_USD
для отрисовки одного графика %40 cpu
не поверю что на этой бирже работают жуниор жопперы за еду
которые не умеют и не знают O() сложностей

и даже самый жуниорсий С++ дев не сможет так постараться что бы у него скомпилируемый софт на С++ столько съедал
Re: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Lexey Россия  
Дата: 02.01.21 21:29
Оценка: -1
Здравствуйте, Тёмчик, Вы писали:

Тё>Т.е. если

Тё>
Тё>auto a1 = std::unique_ptr<A>(new A());
Тё>auto a2 = std::unique_ptr<A>(new A());
Тё>abc(a1, a2, some_other_function())

Тё>a1.get() // null ptr
Тё>


Тё>abc() может внутри написать

Тё>
Тё>std::unique_ptr<A> myA1 = a1;
Тё>

Тё>И этим разрушить объект в a1.

Нет. Это даже не скомпилируется.
"Будь достоин победы" (c) 8th Wizard's rule.
Re: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: AleksandrN Россия  
Дата: 02.01.21 23:51
Оценка: 1 (1)
Здравствуйте, Тёмчик, Вы писали:

Тё>С++11 emplace_back

Тё>
Тё>std::vector<int> v;
Тё>v.emplace_back(123);
Тё>v.emplace_back(v[0]);
Тё>

Тё>Думаете, результат будет [123, 123]? Think again.

Сюрпризы здесь будут, если тип будет не int, а класс с конструктором перемещения.


Тё>
Тё>abc(std::unique_ptr<A>(new A()), std::unique_ptr<A>(new A()), some_other_function())
Тё>


Тё>В до C++ 11-е времена было нормально написать так:

Тё>
Тё>std::auto_ptr<A> a1 = std::auto_ptr<A>(new A());
Тё>std::auto_ptr<A> a2 = std::auto_ptr<A>(new A());
Тё>abc(a1.get(), a2.get(), some_other_function())
Тё>


Прототип abc() напиши.
Тебе и вправду на JS жизнь будет проще
От: CreatorCray  
Дата: 03.01.21 02:46
Оценка: +1 -1
Здравствуйте, Тёмчик, Вы писали:

Артёмка...
Ну а С++ то тут собственно каким боком?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[2]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Тёмчик Австралия жж
Дата: 03.01.21 04:28
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>Сюрпризы здесь будут, если тип будет не int, а класс с конструктором перемещения.

Да вроде ответили выше, что проблема была до VC++ 2015 включительно в реализации расширения буфера у std::vector. Что может быть не так с конструктором перемещения?


AN>Прототип abc() напиши.


Что-то на голых указателях или лучше ссылках
void abc(A const *a1, A const *a2, int b)

void abc(A const &a1, A const &a2, int b)
...
abc(*a1.get(), *a2.get(), some_other_function())
Re[3]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 03.01.21 04:30
Оценка:
Здравствуйте, Тёмчик, Вы писали:

N>>Слушай, а что будет? Я проверил на Ideone, всё норм.

Тё>Проверил на ideone — нормально. language:C++ (gcc 8.3).

То есть проблема не в С++, а максимум у производителя стандартной библиотеки.
Re[2]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Тёмчик Австралия жж
Дата: 03.01.21 04:32
Оценка: :))
Здравствуйте, reversecode, Вы писали:

R>никогда больше не ходите на бокс


Нечего по делу сказать- дрочи в сторонке.
Re[4]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Тёмчик Австралия жж
Дата: 03.01.21 04:46
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>То есть проблема не в С++, а максимум у производителя стандартной библиотеки.


Челу прострелило на продакшене. Теперь- то уже пофиксили, но осадочек остался.


Вот ещё пример. В С++ 20 стандарт вошли async/await. Это круто! Может быть, теперь можно обосновать для мобильной android+iOS "быстрой" версии клиента язык разработки C++?

https://en.cppreference.com/w/cpp/language/coroutines

  Упс


Пользуясь случаем, 2 вопроса:
1) Что с этим делать? Писать сегодня на asyo и в будущем, когда доведут до ума, переписывать на C++ 20?
2) Предположим, начинается новый проект — мобильный клиент к существующему desctop-oriented приложению HTML5. Требования- жесты, скорость, красивый UI, mobile-friendly UI (т.е. переработанные под мелкий экран интерфейсы). Как аргументировать за разработку на чистом C++, в противовес разработке двух версий Kotlin и Swift?
Отредактировано 03.01.2021 4:49 Артём . Предыдущая версия . Еще …
Отредактировано 03.01.2021 4:48 Артём . Предыдущая версия .
Re[5]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 03.01.21 04:58
Оценка:
Здравствуйте, Тёмчик, Вы писали:

N>>То есть проблема не в С++, а максимум у производителя стандартной библиотеки.

Тё>Челу прострелило на продакшене. Теперь- то уже пофиксили, но осадочек остался.

Но это всё равно не недостаток С++. Кому-то попался софт с ошибкой — бывает.

Тё>Вот ещё пример. В С++ 20 стандарт вошли async/await. Это круто! Может быть, теперь можно обосновать для мобильной android+iOS "быстрой" версии клиента язык разработки C++?

Тё>https://en.cppreference.com/w/cpp/language/coroutines

Тё>
  Упс


Но это не упс — тебе говорят, что ты опцию -fcoroutines компилятору не добавил.

Тё>Пользуясь случаем, 2 вопроса:

Тё>1) Что с этим делать? Писать сегодня на asyo и в будущем, когда доведут до ума, переписывать на C++ 20?

Это зависит от того, какой компилятор у тебя доступен. Только не говори, что во всех остальных языках такой проблемы нет и они ещё до выхода стандарта языка (или в момент выхода) могут на него пересесть. Нет такого.

Тё>2) Предположим, начинается новый проект — мобильный клиент к существующему desctop-oriented приложению HTML5. Требования- жесты, скорость, красивый UI, mobile-friendly UI (т.е. переработанные под мелкий экран интерфейсы). Как аргументировать за разработку на чистом C++, в противовес разработке двух версий Kotlin и Swift?


А зачем тут С++? Я бы не брался. Можно спросить у человека с опытом — Dair. Они на плюсах желают ядро с логикой, а весь Гуй и платформоориентированный код на Kotlin и Swift (или Java и Objective C). Что тут такого?
Re[6]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Тёмчик Австралия жж
Дата: 03.01.21 05:35
Оценка: :))) :)))
Здравствуйте, Nuzhny, Вы писали:

N>Но это не упс — тебе говорят, что ты опцию -fcoroutines компилятору не добавил.

Я то тут причём? Это пример на официальной странице C++ не работает.

N>Это зависит от того, какой компилятор у тебя доступен. Только не говори, что во всех остальных языках такой проблемы нет и они ещё до выхода стандарта языка (или в момент выхода) могут на него пересесть. Нет такого.

TS/JS транспилируется в понятный IE11 старый JS. И таким образом, фичи новейшего TS/JS работают в старых браузерах.

Тё>>2) Предположим, начинается новый проект — мобильный клиент к существующему desctop-oriented приложению HTML5. Требования- жесты, скорость, красивый UI, mobile-friendly UI (т.е. переработанные под мелкий экран интерфейсы). Как аргументировать за разработку на чистом C++, в противовес разработке двух версий Kotlin и Swift?


N>А зачем тут С++? Я бы не брался.

Как зачем? Чтобы было на C++. От любви к искусству, вспомнить молодость, когда трава была зеленее.


N> Можно спросить у человека с опытом — Dair. Они на плюсах желают ядро с логикой, а весь Гуй и платформоориентированный код на Kotlin и Swift (или Java и Objective C). Что тут такого?

Так это не native C++ тогда. Издержки на JNI при каждом событии. Imho более разумно в этом случае делать на React.native, и какие-то куски вроде нейросеток например, расшивать на C++. Да тот же tensorflow.js прицепить, а он крутит ядро на GPU.
Вот пример нейросетка обрабатывает видеопоток в реалтайм https://storage.googleapis.com/tfjs-models/demos/facemesh/index.html. Imho круто- не важно, на чём писали, важен результат.
Re[3]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: CreatorCray  
Дата: 03.01.21 06:09
Оценка: +11 -1 :))) :)))
Здравствуйте, Тёмчик, Вы писали:

Тё>Нечего по делу сказать- дрочи в сторонке.

Если бы ты сам хоть раз в жизни последовал этому совету...
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: Максим Россия  
Дата: 03.01.21 07:07
Оценка:
Тё>Можно потратить всё время на обдумывание этих слоёв грабель, вместо оптимального решения задачи.

Тёмчик, я тут сейчас читаю книгу по Ассемблеру, прошу тебя — не смотри на него! Боюсь твое сердце может не выдержат того, что ты увидишь...
Errare humanum est
Re[2]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: lpd Черногория  
Дата: 03.01.21 07:16
Оценка: :))) :)
Здравствуйте, Максим, Вы писали:

Тё>>Можно потратить всё время на обдумывание этих слоёв грабель, вместо оптимального решения задачи.


М>Тёмчик, я тут сейчас читаю книгу по Ассемблеру, прошу тебя — не смотри на него! Боюсь твое сердце может не выдержат того, что ты увидишь...


Ассемблер гораздо практичнее современного С++, для своих целей.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re[2]: Эффективный простреливатель ног C++ 11, 14, 17, 20
От: reversecode google
Дата: 03.01.21 07:21
Оценка: :)
после typescript он стал ИТ импотентом
вряд ли что то сможет
доказательств он уже нагенерил за неделю
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.