С++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
ЭЭЭЭ что???!!
И все эти приседания из-за того, что такое вот приведёт к утечке памяти.
Но авторам новых фич показалось мало треша и угара, 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
Но это хороший тест, на котором ломаются многие самодельные аналоги 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 непосредственно, и нужно элементы обрабатывать в особом порядке (сначала новый, потом старые, а не наоборот), что при первом прочтении выглядит немного странным.
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
пользуясь случаем хочу поинтересоваться у покалеченного С++ магистра черных сил
если жопаскрипт такое быстрое г
то почему везде где оно используется как правило отжирает у броузера ~%40 cpu ?
а при открытии страницы минуту может тупо висеть
вот прямо сейчас что бы далеко не ходить
биржа ексмо https://exmo.com/uk/trade/BTC_USD
для отрисовки одного графика %40 cpu
не поверю что на этой бирже работают жуниор жопперы за еду
которые не умеют и не знают O() сложностей
и даже самый жуниорсий С++ дев не сможет так постараться что бы у него скомпилируемый софт на С++ столько съедал
Re: Эффективный простреливатель ног C++ 11, 14, 17, 20
Здравствуйте, 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, Вы писали: N>То есть проблема не в С++, а максимум у производителя стандартной библиотеки.
Челу прострелило на продакшене. Теперь- то уже пофиксили, но осадочек остался.
Вот ещё пример. В С++ 20 стандарт вошли async/await. Это круто! Может быть, теперь можно обосновать для мобильной android+iOS "быстрой" версии клиента язык разработки C++?
Пользуясь случаем, 2 вопроса:
1) Что с этим делать? Писать сегодня на asyo и в будущем, когда доведут до ума, переписывать на C++ 20?
2) Предположим, начинается новый проект — мобильный клиент к существующему desctop-oriented приложению HTML5. Требования- жесты, скорость, красивый UI, mobile-friendly UI (т.е. переработанные под мелкий экран интерфейсы). Как аргументировать за разработку на чистом C++, в противовес разработке двух версий Kotlin и Swift?
Здравствуйте, Тёмчик, Вы писали: 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
Здравствуйте, 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
Здравствуйте, Максим, Вы писали:
Тё>>Можно потратить всё время на обдумывание этих слоёв грабель, вместо оптимального решения задачи.
М>Тёмчик, я тут сейчас читаю книгу по Ассемблеру, прошу тебя — не смотри на него! Боюсь твое сердце может не выдержат того, что ты увидишь...
Ассемблер гораздо практичнее современного С++, для своих целей.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Re[2]: Эффективный простреливатель ног C++ 11, 14, 17, 20