C++ кто-нить сейчас использует, новые фичи, по-полной?

Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Alexandr »

Willy Wonka wrote:Последние 3 кода каждый день C++11. Последний год С++14.

Самое ходовое: auto, constexrp, default constructors, lambdas, move-semantics, decltype, variadic templates, ну и C+11 stdlib.
= delete

:)
Pantigalt
Уже с Приветом
Posts: 802
Joined: 24 Jan 2007 07:32
Location: Сергели->Новосибирск->SFBA->Новосибирск->Москва->NY->SFBA

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Pantigalt »

Мальчик-Одуванчик wrote:
M. Ridcully wrote: Просто хочу понять - нужно ли читать про всякие там C++14, move semantics и т.д. Впечатление какое-то противоречивое складывается - вроде бы и неплохие фичи, но ещё больше грузят и без того перегруженного монстра, не загнулся бы под собственным весом...
Гляньте книжку "C++11 Rocks: GCC Edition"
move semantics - Лучше поискать примеры статей. Если знакомиться по книжке Майерса, то как раз путаница и происходит.
Вы говорите про новую книжку Майерса?
Effective Modern C++ 42 Specific Ways to Improve Your Use of C++11 and C++14
По С++ 11 я читал только Джосаттиса, у него все достаточно сухо написано, читать скучновато.
Спи быстрее, твоя подушка нужна другому. Copyright Зощенко
User avatar
Мальчик-Одуванчик
Уже с Приветом
Posts: 15475
Joined: 27 Sep 2007 22:53

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Мальчик-Одуванчик »

Pantigalt wrote:
Мальчик-Одуванчик wrote:
M. Ridcully wrote: Просто хочу понять - нужно ли читать про всякие там C++14, move semantics и т.д. Впечатление какое-то противоречивое складывается - вроде бы и неплохие фичи, но ещё больше грузят и без того перегруженного монстра, не загнулся бы под собственным весом...
Гляньте книжку "C++11 Rocks: GCC Edition"
move semantics - Лучше поискать примеры статей. Если знакомиться по книжке Майерса, то как раз путаница и происходит.
Вы говорите про новую книжку Майерса?
Effective Modern C++ 42 Specific Ways to Improve Your Use of C++11 and C++14
По С++ 11 я читал только Джосаттиса, у него все достаточно сухо написано, читать скучновато.
Майерс конечно неплох как популяризатор языка.
Andriy777
Уже с Приветом
Posts: 1481
Joined: 28 Jan 2002 10:01

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Andriy777 »

Если Вам "пользоваться" move, а не разрабатывать шаблоны (templates) то я могу Вам расписать Привет-Сообщение без всяких "понтов".
User avatar
turic
Уже с Приветом
Posts: 418
Joined: 11 Mar 2014 03:30
Location: Spb->SFBA

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by turic »

Неужели так нужен был "move" в c++ чтобы выдать это за новую версию? По-моему, нужно было добавить поддержку асинсхонности (как в JS).
Andriy777
Уже с Приветом
Posts: 1481
Joined: 28 Jan 2002 10:01

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Andriy777 »

Move офигенно как был нужен в связи с устоявшимися предыдущими концепциями. Возьмем vector<shared_ptr<MyClass>>. Когда вектор растет в размере нужно скопировать объекты на новое место. Нужно вызвать копирующий конструктор, а не просто скопировать память, так как в общем случае для vector<T> мы не можем даже гарантировать что будет в этой памяти (только Plain Old Data (POD) struct гарантируется).

Для shared_ptr случая это означает InterlockedIncrement, InterlockedDecrement вызовы на каждый указатель. А это уже L3 cache операции с большим кол-вом инструкций.

А если что-нибудь как unordered_map<tuple<...>, set<>> ситуация еще печальней.

Без move народ нарывался на проблемы с производительностью с STL библиотекой. Искал обходные пути и часто избегал STL. А так все ранее написанные идеи просто "устаканились".

Про асинхронность... Она достигается за счет библиотек. В Windows, Concurrency namespace или Parallel Patterns Library делает много чего хорошего. Но, я слышал, такие вещи как await уже на подходе. В принципе в C# await раньше эмулировался через yield return. В C++ yield return тоже эмулируется. Так что асинхронность в стиле await можно было писать с более длинным кодом. Многие не кодируют в стиле await, а просто в стиле task.then.then.then и пр. Без task-ов тоже было плохо, но не смертельно.

Вот, без move было реально плохо. Народ избегал STL. А это катастрофа. Это все равно что на C# избегать .NET framework (для Java придумайте свой аналог). Move - моя любимая особенность в 11. Наряду с function<> и лямбдами конвертирующимися в них.
Andriy777
Уже с Приветом
Posts: 1481
Joined: 28 Jan 2002 10:01

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Andriy777 »

Блин, в предыдущем письме не закончил мысль о растущем, векторе... Короче, не копируем мы shared_ptr - ы, а просто двигаем из содержимое. Interlocked не вызывается.

В общем виде можно в любой программе найти места где объекты лучше передвинуть, а не скопировать. std::move и все. Написать класс поддерживающий move тоже просто.

Но... да, по сравнению с Java или C# набор концепций растет.
Andriy777
Уже с Приветом
Posts: 1481
Joined: 28 Jan 2002 10:01

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Andriy777 »

Еще я, наверное, перегнул палку о том что STL не пользовались из-за отсутствия move. Это была причина с производительностью, да, но народ еще хочет без exceptions. Ну... тяжело им...
User avatar
turic
Уже с Приветом
Posts: 418
Joined: 11 Mar 2014 03:30
Location: Spb->SFBA

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by turic »

Andriy777 wrote:Блин, в предыдущем письме не закончил мысль о растущем, векторе... Короче, не копируем мы shared_ptr - ы, а просто двигаем из содержимое. Interlocked не вызывается.
shared_ptr и interlocked -- брызги с т.з производительности. interlocked реализован на уровне CPU в одну инструкцию.

Тормоза возникают, когда прога лишний раз в сеть ходит, из файла читает или что-то тяжёлое в цикле вычисляет.

В современном с++ все осталось от 80-90х -- один поток. К примеру, открыл файл, прочитал, вычислил, закрыл. А ведь файловое операции асинхронны и прога могла бы делать что-то полезное пока, к примеру, идет чтение. Это сейчас решается только "в ручную" через threads, а поддержки на уровне языка нету, а могла бы быть.
User avatar
Medium-rare
Уже с Приветом
Posts: 9194
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Medium-rare »

turic wrote: В современном с++ все осталось от 80-90х -- один поток. К примеру, открыл файл, прочитал, вычислил, закрыл. А ведь файловое операции асинхронны и прога могла бы делать что-то полезное пока, к примеру, идет чтение. Это сейчас решается только "в ручную" через threads, а поддержки на уровне языка нету, а могла бы быть.
Фича std::async, которую собрались отменять, может разбросать выполнение кода по другим потокам.
... and even then it's rare that you'll be going there...
User avatar
M. Ridcully
Уже с Приветом
Posts: 11999
Joined: 08 Sep 2006 20:07
Location: Силиконка

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by M. Ridcully »

Medium-rare wrote:Фича std::async, которую собрались отменять, может разбросать выполнение кода по другим потокам.
Гы, можно поподробней?
А как пели, как пели... :mrgreen:
Впрочем, сейчас она по-моему довольно примитивно имплементирована - либо всё последовательно, либо тупо запускать поток.
Что в-принципе и логично, ИМХО - есть рантайма никакого нет, то каким боком библиотека может распределить задачи лучше, чем ОС?
Мир Украине. Свободу России.
User avatar
Medium-rare
Уже с Приветом
Posts: 9194
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Medium-rare »

M. Ridcully wrote:Гы, можно поподробней?
А как пели, как пели... :mrgreen:
Впрочем, сейчас она по-моему довольно примитивно имплементирована - либо всё последовательно, либо тупо запускать поток.
Да, standard committee пару лет назад вдруг засобирался объявить std::async deprecated. Ну, недодумана была фича в корне.
Я читал всякие рассылки. Сейчас погуглил, в C++ 14 точно остаётся. Вот тут пишет один из разработчиков стандарта: http://open-std.org/jtc1/sc22/wg21/docs ... /n3780.pdf

Как раз пару лет назад в конкретном проекте, так и так потыкали в std::async, вообще работает, но не все требования удовлетворяет, особенно, по отмене исполнения, и вообще абстрагирована от thread pool, слишком глубоко зарыт. И решили использовать MS Parallel Patterns.
Что в-принципе и логично, ИМХО - есть рантайма никакого нет, то каким боком библиотека может распределить задачи лучше, чем ОС?
Ну, ведь никто не запрещает к API обращаться не непосредственно из пользовательского кода. Просто трудно тогда сделать фичу consistent для разных платформ.
... and even then it's rare that you'll be going there...
Andriy777
Уже с Приветом
Posts: 1481
Joined: 28 Jan 2002 10:01

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Andriy777 »

turic wrote:
Andriy777 wrote:Блин, в предыдущем письме не закончил мысль о растущем, векторе... Короче, не копируем мы shared_ptr - ы, а просто двигаем из содержимое. Interlocked не вызывается.
shared_ptr и interlocked -- брызги с т.з производительности. interlocked реализован на уровне CPU в одну инструкцию.

Тормоза возникают, когда прога лишний раз в сеть ходит, из файла читает или что-то тяжёлое в цикле вычисляет.

В современном с++ все осталось от 80-90х -- один поток. К примеру, открыл файл, прочитал, вычислил, закрыл. А ведь файловое операции асинхронны и прога могла бы делать что-то полезное пока, к примеру, идет чтение. Это сейчас решается только "в ручную" через threads, а поддержки на уровне языка нету, а могла бы быть.
Пример с shared_ptr был дан как показательный, что даже с такой простой вещью как shared_ptr move оптимизация применима. В последний раз я читал, что interlocked идет за 9 тактов, когда как L0 операции за 2-3. Более реальные оптимизации в случаях вроде контейнера контейнеров (привел пример).

Мы работаем с кодом в котором сложные циклы, оперируют с контейнерами и пр. Асинхронность за счет библиотек.
Andriy777
Уже с Приветом
Posts: 1481
Joined: 28 Jan 2002 10:01

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Andriy777 »

A... еще, чтобы сделать этот долбанный Interlocked нужно сначала зареференсить память со счетчиком.

Ну и, короче,... я уже говорил что провел 2 года на C++ 11 проекте, закончил в perf команде? Работает move. Особенно там, где даже не надо явно его вызывать (rvalue in expressions) и как часть STL, где они им пользуются вовсю.
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Alexandr »

turic wrote: В современном с++ все осталось от 80-90х -- один поток. К примеру, открыл файл, прочитал, вычислил, закрыл. А ведь файловое операции асинхронны и прога могла бы делать что-то полезное пока, к примеру, идет чтение. Это сейчас решается только "в ручную" через threads, а поддержки на уровне языка нету, а могла бы быть.
есть на уровне библиотек, все почти как в .net и java. В С++ даже не напряглись новые названия придумать :lol:
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Alexandr »

по поводу move еще словечко:
очень важный класс объектов, которые нельзя копировать, но можно мувать :)
Тот же класс сокета, копировать нельзя (что делать с дескриптором непонятно), а вот мувать пожалуйста
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Alexandr »

и еще словечко,
если кому надо, вот тут introductional description неплохой
http://thbecker.net/articles/rvalue_ref ... on_01.html
Andriy777
Уже с Приветом
Posts: 1481
Joined: 28 Jan 2002 10:01

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Andriy777 »

А для тех, кто думает, что врубился в move, вот, новомодный coding pattern, попробовать осознать:

1. Нафига
2. Сколько теряем производительности в случае, когда цель "нафига" не достигается.

class X
{
string _a;
string _b;
string _c;

public:

// No... not this way... even though earlier it was a pattern
// X(const string& x,
// const string& y,
// const string& z)
// : _a(x), _b(y), _c(z)
//{
//}


// Here is some new pattern...
X(string x,
string y,
string z)
: _a(move(x)), _b(move(y)), _c(move(z))
{
}

// Other useful logic is skipped...
};
User avatar
Medium-rare
Уже с Приветом
Posts: 9194
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Medium-rare »

Зачем? Очень сильно печёмся о производительности? Представляется вполне уместным в сигнатуре конструктора сказать string&& x? Или если речь пойдёт о можно/нельзя со стороны caller, тогда ещё и альтернативный традиционный конструктор иметь, хоть с const string&, хоть с string и последующим явным move.
... and even then it's rare that you'll be going there...
User avatar
AndreyT
Уже с Приветом
Posts: 2997
Joined: 14 Apr 2004 01:11
Location: SFBA (было: Минск, Беларусь)

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by AndreyT »

Andriy777 wrote:А для тех, кто думает, что врубился в move, вот, новомодный coding pattern, попробовать осознать:
1. Нафига
Хм... Если вы удосужидись узнать об этом паттерне, то почему вы не удосужились поинтереосваться "нафига"?

"Being movable" является намного более слабым требованием, чем "being copyable". Данный паттерн снимает с параметра жесткое требование "being copyable", т.е. не требует безусловной копируемости объекта. А исходный вариант всегда безусловно жестко требует копируемости.
Andriy777 wrote: 2. Сколько теряем производительности в случае, когда цель "нафига" не достигается.
Это в каком случае? В случае, когда копирование все-таки используется?

Code: Select all

string a, b, c;
X x(a, b, c);
Да, в таком случае возможна некоторая потеря производительности на том, что сразу за копированием будет выполняться еще и move. Это много? Учитывая, что стоимоость move обычно коррелирована со стоимостью copy, но при этом move обычно как минимум на порядок дешевле, ясно, что негативный эффект от лишнего move будет все равно практически не заметен на фоне затрат на copy.

При этом не надо забывать, что ситуация соврешенно симметрична со "старым" вариантом - в старом варианте была потеря производительности из-за того, что делалось копирование в ситуации, когда можно было обойтись последовательностю construct+move. Например

Code: Select all

X x("a", "b", "c");
дает нам очевидный потенциальный выигрыш в производительности именно в новом варианте.
Best regards,
Андрей
Andriy777
Уже с Приветом
Posts: 1481
Joined: 28 Jan 2002 10:01

Re: C++ кто-нить сейчас использует, новые фичи, по-полной?

Post by Andriy777 »

Вопрос мой был специально для "новичков" в move, чтобы они разобрались. Правильно, эти новые прототипы используют для возможности двигания памяти. И не только в конструкторах, но и в нормальных функциях, когда неохота возиться с шаблонами или overloads. С функциями одного аргумента пишут overloads (см. push_back(const T&), push_back(T&&)). A с 2-мя и выше - как написал.

Те, кто не смотрит в Intellisense прототипы вызовов, в общем, почти ничего не теряют (правда, в случае со строкой там 16 символов (или байт) все таки зарезервировано не на heap, а как часть объекта - small string optimization). А те кто смотрит, может соптимизировать руками типа так:

if (condition...)
{
string text = BuildText();
cout << text;
return new X(BuildMoreText(), move(text), "abc");
}

Return to “Работа и Карьера в IT”