Назначение QString освобождает распределение - PullRequest
0 голосов
/ 01 марта 2019

У меня есть простой код QT, который вызывается очень часто.Он должен обработать некоторые данные и затем отформатировать их в QString, который отправляется объекту QwtText.Сейчас функция каждый раз создает объект QString со всей работой по динамическому распределению памяти.Затем этот объект уничтожается и память освобождается после выполнения функции.

Я пытаюсь оптимизировать код, создав локальную переменную класса QString, которая будет содержать эту отформатированную строку.Идея состоит в том, чтобы предотвратить повторные вызовы malloc/free.Однако сразу после первого назначения строки оказывается, что объект QString освобождает и снова выделяет память, судя по числу, возвращаемому int QString::capacity() link .

m_valuesLabelText.clear();
// Capacity is 1011
m_valuesLabelText += "<table width=50>";
// Capacity is 16

IsЕсть ли способ предотвратить такое перераспределение и убедить QString повторно использовать старый буфер?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019
QString & oftenCalledFunction(BS *bs, QString &p)
{
   p += "assignNew";
}

void func()
{
   QString p(MAX_SIZE); //set MAX_SIZE appropriately.
   BS bs;
   p = oftenCalledFunction(&bs, p);
}

Таким образом, вы размещаете в стеке, избегая вызовов malloc.Это помогает?Malloc не очень плох, хотя, он не сразу освобождает память обратно в систему.В большинстве бесплатных библиотек хранилищ реализована какая-то стратегия распределения пула.

0 голосов
/ 01 марта 2019

QString::clear освобождает, как вы можете видеть, читая источник, например, здесь .

QString::resize не освобождает, поэтому это может быть решением вашей проблемы: yourString.resize(0).

Используйте QString::reserve для выделения подходящего буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...