Здравствуйте, so5team, Вы писали:
S>>>Покажите C++ников в этой теме, которые бы твердили "C++ всех быстрее". С ссылками и цитатами.
Тё>>Вы сами твердили в споре про sentinel node и демонстрировали непонимание предмета.
S>Если я это твердил, то вам не составит труда дать ссылку на конкретную цитату.
http://rsdn.org/forum/job/7913002.1Автор: so5team
Дата: 26.12.20
S>Кроме того, приведенный выше код можно считать документально зафиксированным подтверждением того, что местный Тёмчик говнокодер, неспособный в простейшие структуры данных. Ибо такая наивная реализация изъятия элемента из двусвязного списка без проверки на null значений node.prev/node.next -- это про*б сравнимый с неспособностью развернуть строку. Тёмчик, почему меня не удивляет факт того, что вы говнокодер?
Тё>>А когда я предложил решение на ёлку залезть (O(1)) и непоцарапаться (cache locality), вы перешли на оскорбления.
S>Было предложение хранить ноды в преаллоцированном векторе фиксированного размера. За такое сразу в сад. Ибо если есть возможность заранее предсказать количество подписок, то пляски с динамическими контейнерами не нужны.
http://rsdn.org/forum/job/7913532.1Автор: Тёмчик
Дата: 27.12.20
S>Пока что вырисовывается приблизительно такая картина:
Скрытый текст
S>
S>template<typename T>
S>class SubscriptionStorage {
S>public:
S> struct Unsubscription {
S> virtual ~Unsubscription() = default;
S> virtual void unsubscribe() noexcept = 0;
S> };
S> [nodiscard]]
S> Unsubscription * subscribe(T && value);
S> ...
S>private:
S> struct Link {
S> virtual ~Link() = default;
S> Link * prev_;
S> Link * next_;
S> };
S> struct OneSubscription : public Link, public Unsubscription {
S> T payload_;
S> ...
S> void unsubscribe() override {
S> ... // Вычеркивание из списка.
S> delete this; // Уничтожение узла.
S> }
S> }
S> Link sentinel_;
S>};
S>template<typename T>
S>Unsubscription * SubscriptionStorage::subscribe(T && value) {
S> return new OneSubscription(std::move(value), ...);
S>}
S>
Примерно так, только названия поменять:
Unsubscription => Subscription (подписка)
SubscriptionStorage => ObservableImpl
Link => Node
OneSubscription => SubscriptionNode
sentinel иницировать в конструкторе:
sentinel.next = sentinel.prev = sentinel.
Можно ещё поиграться с пре-инициализацией кэша SubscriptionNode как цикличного списка, и чтобы ObservableImpl брал Node оттуда в свой список, а при unsubscribe возвращал обратно. Будет тебе тогда cache locality и избежание динамического выделения памяти:
SubscriptionNode[2048] nodeCache;
http://rsdn.org/forum/job/7913552.1Автор: so5team
Дата: 27.12.20
Тё>sentinel иницировать в конструкторе:
Тё>sentinel.next = sentinel.prev = sentinel.
За такие инициализации в конструкторе в C++ со времен 1990-х по рукам бъют. Но откуда вам знать-то.
Тё>Можно ещё поиграться с пре-инициализацией кэша SubscriptionNode как цикличного списка, и чтобы ObservableImpl брал Node оттуда в свой список, а при unsubscribe возвращал обратно. Будет тебе тогда cache locality и избежание динамического выделения памяти:
Тё>
Тё>SubscriptionNode[2048] nodeCache;
Тё>
Тёмчик, да вы мало того, что зведун, так еще и архитектор-астронавт? Предложить мутную и сложную схему с большими накладными расходами и звиздеть, что это правильный дизайн.
Достаточно привёл цитат? Вы сами завели объект sentinel
в теле SubscriptionStorage, а потом докопались, в оскорбительной форме "со времен 1990-х по рукам бъют" SubscriptionStorage присваивать указатель на поле из тела SubscriptionStorage.
S>просьба обратить строку от чайника, который не в курсе, какие способы представления строк встречаются в природе, она о многом говорит. О многом плохом, касающемся конторы.
In computer programming, a string is traditionally a sequence of characters
Open-ended question предполагает задать мутный вопрос, и ожидается наводящий вопрос от кандидата- например, про в каком представлении, а может даже и в какой кодировке.
Я продолжаю задавать написать функцию "перевернуть строку", но сразу с сигнатурой reverseString(char[] a): void — больше никаких open-ended.
S>>>Тёмчик, еще раз: у некоторых из тех, кого вы называете "не знающими алгоритмы плюсодрочерами" в OpenSource десятки тысяч строк код.
Тё>>Мне неинтересно читать ваш отлаженный код.
S>Тогда закройте рот и не звиздите о чужой квалификации. Если вам что-то кажется, то ноги в руки и бегом в религиозное заведение. А если рот публично открываете и пытаетесь на кого-то наезжать, то потрудитесь свои наезды аргументировать.
Я не наезжаю на вас неаргументированно. Только по делу. И ваша библиотека в опен сорсе мне неактуальна. Может быть, она неплохая, я не знаю. Для меня актуальна
http://reactivex.io/.
S>Когда вы здесь просили отревьювить ваш код, то вам высказали предметные замечания. Из которых как раз таки ваш уровень стал понятен.
Набросились, коршуны
. Я перестал писать на C++ до введений C++ 11. Ну да, неправильно использовал emplace_back. Это страшный грех, учитывая, что этих вещей не было в моё время в C++?
S>Я указал на то, как должны инициализироваться члены класса. И на то, что вы, не зная, как это делается должным образом, не владеете инструментом, о применимости которого делаете здесь громкие заявления. Т.е. откровенно звиздите о том, в чем не разбираетесь.
Я привёл ваши цитаты выше, как вы и просили. Вы так брызжете слюной, а вот мне непонятно, что в этот раз не так-то. Нету там умных указателей и их неправильного использования. Мой код приведён как "псевдо код на доске", для объяснения. А уж вы можете его переделать с учётом вашей экспертизы в C++ 20.
S>В этом камень преткновения. А не в том, что какие-то мифические сиплюспоюсники в вакууме свято верят в самый быстрый на свете C++.
Не мифические. Вы и хайлендер- яркие представители.