次の例の暗黙的な共有の概念によれば、Windows タスク マネージャーのメモリ使用量が少なくなるはずです。
クラスからforループで1000000オブジェクトを作成し、作成されたオブジェクト間でEmployee
内部データ(EmployeeData
クラス)を共有する場合があります。
for (int i = 0; i < 1000000; ++i) {
Employee *e1 = new Employee(); // calls default constructor
Employee *e2 = e1;
Employee *e3 = e2;
//e1->setName("Hans Holbein"); // ***
}
***
: Qt ドキュメントQSharedDataPointerに従って言及された行のコメントを外すと、共有データから切り離され、独自のコピーが作成されますEmployeeData
。
EmployeeData
およびEmployee
クラス:
class EmployeeData : public QSharedData
{
public:
EmployeeData() : id(-1) { }
EmployeeData(const EmployeeData &other)
: QSharedData(other), id(other.id), name(other.name) { }
~EmployeeData() { }
int id;
QString name;
};
class Employee
{
public:
Employee() { d = new EmployeeData; }
Employee(int id, const QString &name) {
d = new EmployeeData;
setId(id);
setName(name);
}
Employee(const Employee &other)
: d (other.d)
{
}
void setId(int id) { d->id = id; }
void setName(const QString &name) { d->name = name; }
int id() const { return d->id; }
QString name() const { return d->name; }
private:
QSharedDataPointer<EmployeeData> d;
};
プラットホーム:Windows 10
Qt バージョン:5.7
コンパイラ:MSVC 2015 32bit
結果は次のとおりです(タスクマネージャーから):
- リリース: 40M RAM 使用量
- デバッグ: 189M RAM 使用量
質問:
提供されたループの想定EmployeeData
サイズに基づいて12
、1 つのインスタンスを作成し、EmployeeData
それを別の 999,999 オブジェクト インスタンスと共有する必要があるため、メモリ使用量を少なくとも 3M 未満に削減する必要があります。よろしいですか?
次の行のコメントを外すと、 の 1000,000 個の一意のインスタンスを作成する必要がEmployeeData
あるため、インスタンスによって使用されるメモリが増加します。それでよろしいですか?
//e1->setName("Hans Holbein");