Re[19]: Исповедь C++ника
От: so5team https://stiffstream.com
Дата: 26.12.20 07:31
Оценка: +1
Здравствуйте, Тёмчик, Вы писали:

Тё>>>Ну смотри — удаление подписки. Как ты её собрался искать в контейнере? Какова стоимость?


S>>Зависит от обстоятельств. К которым мы перейдем ниже, там где фрагменты кода появятся.

Тё>Не юли.

Сперва прочитайте то, что вам пишут, потом уже отвечайте.

S>>Гораздо более серьезно, чем когда вы заявляете, что C++ не используется для рилтайма.

Тё>Я заявлял, что в ядре не место C++. Именно полноценному C++, ибо C-с-классами не является полноценным C++ в понимании стандарта C++.

Вы заявили следующее (http://rsdn.org/forum/job/7907304.1):
Автор: Тёмчик
Дата: 17.12.20


> Реалтаймовые системы не на плюсах делают.


Все ходы записаны.

Тё>И часто вас жизнь заставляет замерять оверхед на 10 элементах?


Нет. Но бывает.

S>>Ибо в C++ Node<T> хранил бы экземпляр T не по указателю, а по значению. А то у вас получится по две аллокации на объект в списке: первая для самого T, вторая для Node<T>.

Тё>Ты в курсе, что есть указатель на T, в данном случае? Может быть, это указатель на какой-то родительский объект или другую подписку, которого можно дёрнуть для оповещения об изменениях. Может быть, его и заполнять необязательно.

Тёмчик, давайте говорить о примере от B0FEE664. В котором под T можно подразумевать только std::pair<OnPress, void*>. Если вы хотите ввести в обсуждение еще что-то, то потрудитесь это описать, чтобы люди понимали, о чем речь.

Тё>Чувачелло, величина твоего невежества зашкаливает. Но я же привёл ссылку. Сложно прочитать?

Тё>

Тё>>>https://en.wikipedia.org/wiki/Sentinel_node#Linked_list_implementation


Т.е. вы для хранения списка подписок предлагаете хранить еще и специальный sentinel node?

Тё>Если пописчиков немного, то не стоит заморачиваться на алгоритмическую сложность.


Если вы еще не заметили, то речь идет не про алгоритмическую сложность, а о стоимости по памяти и времени исполнения. В случаях, когда подписчиков немного.

Тё>Кто управляет временем жизни callback?


Подписчик.

S>>Если достаточно всего лишь указателя на callback, то хранение для каждой подписки Subscription -- это дополнительная головная боль. Особенно в C++, где ничего не защищает от обращения к повисшим указателям.

Тё>У хорошего плюсника не бывает тухлых указателей. Вы к таким определённо не относитесь.

Без разницы к каким вы меня относите. Суть в том, что такая проблема есть. И решений, которые ее провоцируют, следует избегать. Тогда будет не важно, хороший плюсник работает с кодом или нет.

S>> Использовали экземпляр subscription для отписки один раз, а потом, по ошибке, сделали отписку повторно. И что будет в итоге?

Тё>В итоге будет nullptr и это правильно. Ибо кривые руки повторно-вызывальщиков отписок, релизов, диспозов и прочих делетов нужно испрямнять жёстко и без церемоний.

На словах все герои. Только вот если у вас отписка работает через поиск (по указателю на callback или по какому-то уникальному Id), то она оказывается более устойчивой к подобным ошибкам.

Кроме того, в C++ объекты по умолчанию копируются. Т.е. если есть:
class Subscription {
  Node * node_;
public:
  ...
  void unsubscribe() {
    if(node_) {
      ...
      node_ = nullptr;
    }
  }
};

То потребуется еще позаботится о том, чтобы объекты Subscription не копировались. Потому что зануление node_ в копии никак не скажется на исходном объекте. А до C++11 нормальных средств для этого в языке не было (а код от B0FEE664 явно написан для C++98).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.