QString和QByteArray内存使用情况

时间:2018-08-07 16:08:40

标签: c++ qt

QByteArray文档指出在内存保护至关重要的情况下将使用它。我一直在研究一个类(FieldName),该类保留了常用QString的内部存储,以便在比较两个FieldName对象是否相等时,可以进行快速整数比较。

我的想法是使用QByteArray而不是QString可以节省一些内存并提高速度,因为我只需要标准ASCII字符。但是,当我在下面的代码中为QByteArray更改QString时,我的测试表明速度有所提高,但内存使用量却增加了一倍以上。这与文档背道而驰。

#ifndef H_FIELDNAME
#define H_FIELDNAME

#include <QString>

class FieldName
{
   public:
      FieldName() : mKey(0) { init(); }
      FieldName(const QString& s);
      const QString& constString() const;
      bool operator==(const FieldName& other) const { return mKey == other.mKey; }
      bool operator!=(const FieldName& other) const { return mKey != other.mKey; }
   private:
      int mKey;
      void init();
      int findKey(const QString& s);
};

#endif

CPP文件:

#include "fieldname.h"
// #include <QMutex> // demo version not thread-safe
#include <QVector>

static QVector<QString*> FieldName__List;
static bool FieldName__FirstCall(true);

FieldName::FieldName(const QString& s)
{
   init();
   mKey = findKey(s);
}

const QString& FieldName::constString() const
{
   return(*FieldName__List.at(mKey));
}

void FieldName::init()
{
   if(FieldName__FirstCall)
   {
      if(FieldName__List.isEmpty())
      {
         FieldName__List.append(new QString(""));
         FieldName__FirstCall = false;
      }
   }
}

int FieldName::findKey(const QString& s)
{
   if(s.isEmpty())
      return 0;
   int sz(FieldName__List.size());
   for(int idx=1; idx<sz; ++idx)
   {
      if(s == *FieldName_List.at(idx))
         return idx;
   }
   FieldName__List.append(new QString(s));
   return(FieldName__List.size() - 1);
}

当我在上述类中用QByteArray代替QString时,有人能让我知道我正在做什么,这会导致它使用更多的内存吗?

测试代码:

QStringList qsl; // filled with 84000 unique English words
FieldName fn;
foreach(QString s, qsl)
{
   fn = FieldName(s);
   // do stuff here
}

0 个答案:

没有答案