Как будет вести себя QList, содержащий указатели, при передаче по значению

Предположим, у вас есть QList, содержащий указатели QList<SomeThingCool*>, и вы передаете его методу с сигнатурой void doCoolStuff(QList<SomeThingCool*> list), каковы будут пространственные и временные последствия такого вызова?

Я предполагаю, что будут некоторые накладные расходы, потому что будет создана копия объекта QList, однако нам не нужно делать глубокую копию, поскольку мы имеем дело с указателями.

Одно отличие в поведении состоит в том, что если doCoolStuff внесет изменения в список, исходный список останется нетронутым.


person Leon    schedule 02.11.2014    source источник
comment
Вы понимаете COW в Qt, он же. неявный обмен? Кстати, я не минусовал, просто спросил.   -  person lpapp    schedule 02.11.2014
comment
Никогда даже не слышал об этом термине... Я новичок в Qt... Но я посмотрю на это   -  person Leon    schedule 02.11.2014
comment
Хорошо, в основном, если вы не изменяете список в функции, это просто стоимость дополнительного указателя в пространстве. В противном случае список действительно будет скопирован. Я не уверен, что вам нужно беспокоиться о времени, проведенном здесь. Я дал +1, чтобы компенсировать отрицательный голос, который пришел без объяснения причин. Я не люблю тех.   -  person lpapp    schedule 02.11.2014


Ответы (1)


То, что вы пишете, верно для универсального С++, однако QList среди некоторых других классов Qt немного отличается, когда дело доходит до этого. Это неявно совместно используемый класс, также известный как. копирование при записи (COW). Что это значит, да?

Единственное дополнение к вашему объяснению заключается в том, что если вы не собираетесь изменять список внутри тела метода или функции, ваш список будет неявно общим, что означает, что общий указатель данных будет только дополнительным ограничением пространства.

Если вы намерены изменить список внутри тела функции или метода, для списка будет создана глубокая копия. Естественно, ваши указатели все равно останутся поверхностно скопированными, потому что они являются указателями.

Что касается измерения времени, неявно используя эту технику для этого класса, вы экономите время, затрачиваемое на копирование списка, если вы не делаете никаких изменений.

person lpapp    schedule 02.11.2014