Страницы

Поиск по вопросам

суббота, 16 марта 2019 г.

shared data в Qt

Здравствуйте. У меня возникли небольшие непонимания концепции shared data в Qt. Я прочел соотв. раздел в книги Макса Шлее, а затем ещё одну статью на сайте нокии, где об этом говорилось, но до конца не понял. Я понял, что при простом присваивании классов происходит то же, что и в C#,Java - копируются только ссылки, но указывают они на одни данные. Однако (исходя из книги), если произвести изменения над одним из объектов, то для измененного объекта создается отдельная копия, а счетчик ссылок на старые данные уменьшится на один. Но разве это хорошая концепция? Ведь получается, что это неэффективно. Каждый раз, когда я буду модифицировать данные - будет создаваться новая копия, а старая уничтожаться? Или же копия создается только тогда, когда 2 объекта указывают на одну память? А если, к примеру, у меня есть объект, и есть ещё несколько объектов, в которые я заношу копии объекта первого, затем они где-то, к примеру, у меня модифицируются все. И, к примеру, этих модификаций много и мне не нужно, чтобы в том блоке, где они модифицируются, происходило много копирований памяти, мне нужно, чтобы они заранее скопировались, что тогда делать? Также я встретил там такую фразу: ... вызов конструктора копирования или оператора присваивания не приведет к копированию данных, а только увеличит счетчик ссылок на эти данные на 1 Т.е. конструктор копирования не имеет смысла писать? Его тело не будет выполнятся? Или оно будет выполняться, но не тогда, когда я его вызвал явно, а когда происходит тот самый момент, что один из объектов, указывающих на одну область памяти, модифицирует свои данные? Спасибо.


Ответ

Рекомендую почитать копирование при записи (там про ОС, но на русском, смысл тот же), copy-on-write (на английском, но есть примеры на C++). Если будут вопросы - пишите еще. Если коротко, то копия объекта будет создаваться только тогда, когда происходит изменение данных. Если мы добавляем ссылку на созданный объект, то увеличивается внутренний счетчик. Если мы удаляем объект (который ссылается на какой-либо общий ресурс (shared memory), то внутренний счетчик уменьшается на 1 и если он станет равным 0, произойдет удаление объекта (очистка shared memory).

Комментариев нет:

Отправить комментарий