Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QByteArray и выделение памяти


Автор: nullpoint 1.6.2015, 21:04
Добрый вечер. Объясните новичку, пожалуйста. Нужно ли для массива QByteArray указывать размер или выделять под него память динамически (размер данных в массиве всегда один), или QT сам выделит необходимое количество памяти под данные? Например, создаю массив (в mainwindow.h):
Код

QByteArray data;

В mainwindows.cpp записываю в него сначала 2 байта:
Код

data += 0x01;
data += 0x02;

Затем дописываю еще 8 байт:
Код

data += 0x03; data += 0x07;
data += 0x04; data += 0x08;
data += 0x05; data += 0x09;
data += 0x06; data += 0x10;

Итого размер массива 10 байт. Далее выполняю какие-то действия и очищаю массив:
Код

data.clear();

И так каждый раз при вызове функции, в которой заполняется массив (значения в массиве будут каждый раз новые, здесь указал просто для примера). Нужно ли выделять под него память? Размер массива всегда будет 10 байт. В документации сказано:
Код

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

И приведен пример:
Код

 QByteArray x("free");
 QByteArray y("dom");
 x += y;
 // x == "freedom"

Т.е. сначала размер x был 5 байт, а после операции += стал 8 байт. Правильно ли я понимаю, что мне не нужно указывать размер массива, и QT сам выделит памяти сколько нужно при добавлении данных в массив?

Автор: math64 2.6.2015, 08:45
Да, QByteArray сам выделяет память.
Но чтобы память не выделялась при каждом добавлении байта, можно вызвать reserve().
Узнать сколько байт выделено можно с помощью capacity().
size() выдаёт сколько из них используется.
squeeze() освободжает неиспользованную память.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)