То, что лично вам что-либо не понадобилось, не значит, что это не нужно. Например, если пользоваться ассоциативными массивами размером не более 10 элементов, то даже std::map прекрасно подойдёт. Но это не повод говорить, что использование хеш-таблицы свидетельствует о плохой архитектуре.
Ещё раз.
Атеист не должен доказывать верующему отсутствие бога.
Вы выдвинули утверждение. Обойснуйте его, пожалуйста.
Представьте, что у вас есть большое количество функций, которые друг от друга зависят. Зависимость заключается в том, что для каждой функции на этапе компиляции известно, результаты каких других функций требуются для вычисления этой функции. К примеру, для функций
int a ();
double b ();
bool c (int, double);
char d (int, bool);
известно, что функция c вычисляется именно по тем данным, которые возвращают функции a и b, а функция d вычисляется по результатам функций a и c (именно этих конкретных функций, а не любых функций, возвращающих нужный тип).
Эти зависимости можно изобразить в виде графа:
Теперь представьте, что таких функций очень много и между ними куча зависимостей (но без циклов, разумеется), так что граф получается достаточно большим и сложным.
Далее, в динамике — во время исполнения программы — поступает информация о том, что нужно вычислить некоторое — заранее неизвестное — подмножество этих функций. При этом требуется избежать повторных вычислений. В примере выше функции c и d обе зависят от результата функции a, но функция a должна быть вычислена только один раз.
Допустим, нужно вычислить значение функции d. Это значит, что нужно собрать весь граф, ведущий к d, произвести все промежуточные вычисления (а нашем примере для вычисления функции d требуется вычислить и a, и b, и c) в правильном порядке и без повторений, а затем передать полученные результаты в функцию d, чтобы получить искомый результат.
А поскольку обращения на чтение и запись результатов промежуточных вычислений может быть очень много, желательно положить их радом, чтобы они почаще попадали в строчку кэша.
В свою очередь, прошу обосновать утверждение "если необходимы такие конструкции это прежде всего говорит о плохой архитектуре приложения".
А то получается, что и boost::variant, и boost::any, и даже, простигосподи, полиморфные объекты в коде свидетельствуют о "плохой архитектуре".
Вызов memmove в алгоритмах вместо копирования или переноса тривиальных объектов — вполне себе абстрактная оптимизация.
Концепция обобщённого программирования, по которой строилась СБШ, предполагает максимально общие конструкции, и при этом максимальную эффективность в каждом конкретном случае. Очень рекомендую ознакомиться.
Возможно, утверждение "вся STL заоптимизирована" слишком сильное. Но оно не так уж и далеко от истины.
std:vector аллоцировал по 1 элементу, и каждый раз при добавлении элемента делал фактически realloc с копированием данных
Дорогой друг, вместо ответа позвольте поинтересоваться Вашим опытом в языке C++ (в профиле это не указано). И покорнейше прошу — если, конечно, для Вас это не составит труда — показать примеры Вашего кода на данном языке.
Ещё один "не осиливший".
Такой поток бреда, что даже непросто ответить по пунктам.
"О производительности забыли"
Наверное, поэтому весь STL заоптимизирован по самые гланды, чтобы при каждом удобном случае вызвать наиболее эффективную операцию.
Наверное, именно поэтому в C++11 ввели возможность переноса и пробрасывания.
Наверное, именно поэтому думают о введении сопрограмм.
и т.д.
"строки в силу своей природы не могут работать быстро"
В современных реализациях стандартной библиотеки короткие строки хранятся прямо внутри указателя. То есть память не выделяется в куче, а скопировать такую строку — всё равно, что скопировать целое число.
string_view.
Да, и, кстати, в Бусте есть разбиение строки, которые автор по непонятной причине называет "базовой операцией".
"Шаблоны слишком сложны"
Показательно, что автор говорит не только о вариативных шаблонах, но и об обыкновенных.
SFINAE, диспетчеризация тегов, CRTP — новые идиомы? Да щас.
Костыль под названием "SFINAE" стар, как сами шаблоны, при этом "новые страшные" концепты как раз-таки позволят от этого костыля избавиться.
Диспетчеризация по тегам существует столько же, сколько STL.
Что касается CRTP… При чём тут вообще CRTP?
"C++ изначально ориентирован на последовательный способ передачи данных"
Жаль, что об этом не знают разработчики библиотеки Boost.Compute.
Современный C++ позволяет писать как никогда простой, понятный и быстрый код.
Но некоторые по-прежнему предпочитают лопате и экскаватору тёплую ламповую палку-копалку.
Новость хорошая, сам бы с удовольствием посотрудничал.
Но… Смущает то, что раньше в Яндексе было всё печально с языком C++. Вы уже перешли массово хотя бы на C++11? Как поживают ya::strochka и ya::shtrochka?
Я бы немного переписал статью.
Начал бы так же: «Ручное управление памятью в С++...».
А всё, что идёт дальше, я бы выбросил и написал «не используется».
В теги запишем «RAII, деструктор, умный указатель».
Будет гораздо интереснее и познавательнее.
И не надо придумывать про огромное количество циклов в графе зависимостей объектов. Подобные ситуации — следствие излишней увлечённостью ООП и неправильного проектирования (либо полное его отсутствие).
Если уж пишешь на плюсах, то пиши на плюсах, а не на сях, явах или каких-то других языках.
Также рекомендую почитать статью «Пять популярных мифов о языке C++» и поискать в интернете информацию по ключевым словам «GSL» и «owner<T*>».
Не понял вопроса. Что — "то же самое"?
То, что лично вам что-либо не понадобилось, не значит, что это не нужно. Например, если пользоваться ассоциативными массивами размером не более 10 элементов, то даже
std::map
прекрасно подойдёт. Но это не повод говорить, что использование хеш-таблицы свидетельствует о плохой архитектуре.Ещё раз.
Атеист не должен доказывать верующему отсутствие бога.
Вы выдвинули утверждение. Обойснуйте его, пожалуйста.
Шифровался!
Пожалуйста, обоснуйте утверждение "использование boost::any свидетельствует о плохой или не продуманной архитектуре".
Этих функций сотни. Какие именно будут выполняться — заранее неизвестно.
Предложите "хорошую" архитектуру.
Варианты "позвать пару ифчиков" по очевидным причинам не канают.
Представьте, что у вас есть большое количество функций, которые друг от друга зависят. Зависимость заключается в том, что для каждой функции на этапе компиляции известно, результаты каких других функций требуются для вычисления этой функции. К примеру, для функций
известно, что функция
c
вычисляется именно по тем данным, которые возвращают функцииa
иb
, а функцияd
вычисляется по результатам функцийa
иc
(именно этих конкретных функций, а не любых функций, возвращающих нужный тип).Эти зависимости можно изобразить в виде графа:
Теперь представьте, что таких функций очень много и между ними куча зависимостей (но без циклов, разумеется), так что граф получается достаточно большим и сложным.
Далее, в динамике — во время исполнения программы — поступает информация о том, что нужно вычислить некоторое — заранее неизвестное — подмножество этих функций. При этом требуется избежать повторных вычислений. В примере выше функции
c
иd
обе зависят от результата функцииa
, но функцияa
должна быть вычислена только один раз.Допустим, нужно вычислить значение функции
d
. Это значит, что нужно собрать весь граф, ведущий кd
, произвести все промежуточные вычисления (а нашем примере для вычисления функцииd
требуется вычислить иa
, иb
, иc
) в правильном порядке и без повторений, а затем передать полученные результаты в функциюd
, чтобы получить искомый результат.А поскольку обращения на чтение и запись результатов промежуточных вычислений может быть очень много, желательно положить их радом, чтобы они почаще попадали в строчку кэша.
В свою очередь, прошу обосновать утверждение "если необходимы такие конструкции это прежде всего говорит о плохой архитектуре приложения".
А то получается, что и
boost::variant
, иboost::any
, и даже, простигосподи, полиморфные объекты в коде свидетельствуют о "плохой архитектуре".memmove
в алгоритмах вместо копирования или переноса тривиальных объектов — вполне себе абстрактная оптимизация.Возможно, утверждение "вся STL заоптимизирована" слишком сильное. Но оно не так уж и далеко от истины.
Это невозможно. Стандартом установлена асимптотика выполнения метода
std::vector<...>::push_back
. Это амортизированное O(1).http://www.cplusplus.com/reference/vector/vector/push_back/
Разве что у вас была какая-то левая/самопальная реализация стандартной библиотеки.
;D
Он действительно прав в том смысле, что в гэцэцэ для строк эта техника не используется. Мой косяк.
Но:
Дорогой друг, вместо ответа позвольте поинтересоваться Вашим опытом в языке C++ (в профиле это не указано). И покорнейше прошу — если, конечно, для Вас это не составит труда — показать примеры Вашего кода на данном языке.
Рекомендую ознакомиться с концепцией обобщённого программирования.
Не понял.
Что?! Где?! Когда?!
Исходники стандартной библиотеки, которые поствляются с гэцэцэ и шлангом, открыты для чтения круглосуточно.
Милости просим.
Даже если так, то в нормальной сторонней библиотеке эти классы, скорее всего, будут STL-совместимые.
Например?
Это ложное утверждение.
См. STL.
Ещё один "не осиливший".
Такой поток бреда, что даже непросто ответить по пунктам.
"О производительности забыли"
Наверное, поэтому весь STL заоптимизирован по самые гланды, чтобы при каждом удобном случае вызвать наиболее эффективную операцию.
Наверное, именно поэтому в C++11 ввели возможность переноса и пробрасывания.
Наверное, именно поэтому думают о введении сопрограмм.
и т.д.
"строки в силу своей природы не могут работать быстро"
string_view
.Да, и, кстати, в Бусте есть разбиение строки, которые автор по непонятной причине называет "базовой операцией".
"Шаблоны слишком сложны"
Показательно, что автор говорит не только о вариативных шаблонах, но и об обыкновенных.
SFINAE, диспетчеризация тегов, CRTP — новые идиомы? Да щас.
"C++ изначально ориентирован на последовательный способ передачи данных"
Жаль, что об этом не знают разработчики библиотеки Boost.Compute.
Современный C++ позволяет писать как никогда простой, понятный и быстрый код.
Но некоторые по-прежнему предпочитают лопате и экскаватору тёплую ламповую палку-копалку.
Новость хорошая, сам бы с удовольствием посотрудничал.
Но… Смущает то, что раньше в Яндексе было всё печально с языком C++. Вы уже перешли массово хотя бы на C++11? Как поживают
ya::strochka
иya::shtrochka
?Каким образом я должен был догадаться, что «Mihaly Csikszentmihalyi» произносится как «Михай Чиксентмихайи»?
Ладно ещё венгр. А если будет китаец, иероглифами напишете?
ус отклеилсясообщения к комитам не на русском.Начал бы так же: «Ручное управление памятью в С++...».
А всё, что идёт дальше, я бы выбросил и написал «не используется».
В теги запишем «RAII, деструктор, умный указатель».
Будет гораздо интереснее и познавательнее.
И не надо придумывать про огромное количество циклов в графе зависимостей объектов. Подобные ситуации — следствие излишней увлечённостью ООП и неправильного проектирования (либо полное его отсутствие).
Если уж пишешь на плюсах, то пиши на плюсах, а не на сях, явах или каких-то других языках.
Также рекомендую почитать статью «Пять популярных мифов о языке C++» и поискать в интернете информацию по ключевым словам «GSL» и «owner<T*>».