В чем разница между QByteArray и QList ‹unsigned char› или QVector ‹unsigned char›?

QByteArray содержит отдельные байты, и если мы сделаем QList из unsigned chars, это также будет содержать отдельные байты.

По какой причине существует QByteArray, когда существует QList<unsigned char>?
В чем разница между QByteArray и QList<unsigned char> или QVector<unsigned char>?

Что мне не хватает?


person Aquarius_Girl    schedule 21.03.2016    source источник
comment
QByteArray специализируется на строковых операциях, QList ‹T› - нет (replace, fromNumber, left / mid / right). так что это все равно что сказать, почему есть std::string, когда мы могли бы использовать std::vector<char>   -  person Zaiborg    schedule 21.03.2016
comment
@Zaiborg, не могли бы вы перечислить основные отличия?   -  person Aquarius_Girl    schedule 21.03.2016


Ответы (2)


QByteArray - полезная оболочка для char*. Подходит для потоковой передачи с QDataStream, строковых операций и другого управления данными. Из документации вы также можете найти, что:

За кулисами он всегда гарантирует, что за данными следует терминатор '\ 0', и использует неявное совместное использование (копирование при записи), чтобы уменьшить использование памяти и избежать ненужного копирования данных.

QList, сначала не является линейным (последующим) в памяти (вы должны использовать QVector) и не иметь такого полезного API

person Jeka    schedule 21.03.2016
comment
Применимо ли все это и к QVector? - person Aquarius_Girl; 21.03.2016
comment
@TheIndependentAquarius да, единственное существенное различие между списком и вектором - это хранилище памяти. - person Jeka; 21.03.2016

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

От: http://doc.qt.io/qt-5/qlist.html#details

QVector должен быть вашим первым выбором по умолчанию. QVector обычно дает лучшую производительность, чем QList, потому что QVector всегда сохраняет свои элементы последовательно в памяти, где QList будет размещать свои элементы в куче, если sizeof (T) ‹= sizeof (void *) и T не был объявлен как Q_MOVABLE_TYPE или Q_PRIMITIVE_TYPE с использованием Q_DECLARE_TYPEINFO. См. Объяснения в разделе «За» и «против» использования QList.

QByteArray также предоставляет удобные методы для работы с байтами (и строками в целом).

person Jaa-c    schedule 21.03.2016
comment
does not guarantee any data locality Пожалуйста, объясните это со ссылкой на документы qt. Спасибо. - person Aquarius_Girl; 21.03.2016
comment
QVector should be your default first choice. QVector<T> will usually give better performance than QList<T>, because QVector<T> always stores its items sequentially in memory, where QList<T> will allocate its items on the heap unless sizeof(T) <= sizeof(void*) and T has been declared to be either a Q_MOVABLE_TYPE or a Q_PRIMITIVE_TYPE using Q_DECLARE_TYPEINFO. See the Pros and Cons of Using QList for an explanation. - QList - person Jaa-c; 21.03.2016
comment
Спасибо, в таком случае означает ли это, что QVector <unsigned char> будет таким же, как QByteArray? - person Aquarius_Girl; 21.03.2016