-1

次の例の暗黙的な共有の概念によれば、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");
4

1 に答える 1

2

ここでは暗黙的な共有は行われません。同じオブジェクトへの 2 つのポインターがあるだけです。

暗黙的な共有は、オブジェクトのコピー コンストラクターまたは代入演算子が使用されている場合にのみ機能します。

newfor ループでの大量のメモリ リークを無視して、これを行うと暗黙的な共有が利用されます。

Employee *e2 = new Employee(e1); // copy constructor, implicit sharing
于 2016-09-15T16:44:31.963 に答える