0

私の命名法が間違っている場合は、許してください/修正してください。

の使い方がいまいち理解できませんでしたconst_cast。一般的に言えば、const-correct ではないレガシー関数を使用していない限りconst_cast、使用する必要がある場合、クラス/メソッドにはおそらく根本的な欠陥があるように思えます。ただし、その使用が適切な場合に遭遇した可能性があります。私は、構築中に割り当てられ、オブジェクトの耐用年数の間一定のままであるいくつかのメンバーを持つ大規模なクラスを持っています。

これらのオブジェクトは頻繁に破棄および構築されるため、ファクトリ モデルと呼ばれるものを試してみたいと思います。オブジェクトを作成/破棄する代わりに、割り当てられていないオブジェクトのキャッシュを取得/返したいと考えています。例(もちろん単純化されています):

class PersonFactory {
public:
    const Person* getPerson(const QString& newname) {
    //I can't assign the new name because it's const
        if(m_personCache.isEmpty())
            return createNewPerson();
        else
            return m_personCache.pop();
    }
    void returnPerson(Person* person) { m_personCache.push(person); person = 0; }
    static PersonFactory* instance;
private:
    Person* createNewPerson() const { return new Person(""); }
    QStack<Person*> m_personCache;
}

class Person {
public:
    friend Person* PersonFactory::createNewPerson();

    const QString& name() const {
        return m_name;
    }

    void destroy() {
        PersonFactory::returnPerson(this);
    }
private:
    Person(QString name) : m_name(name) {}
    //m_name is const and should remain that way to prevent accidental changes
    const QString m_name;
}

であるため、新しい名前を割り当てることはできませんconst。これは良いケースconst_castですか、それとも明らかな代替案がありませんか? 使用const_castするとパフォーマンスが低下しますか?

4

1 に答える 1

0

const_cast を使用するとパフォーマンスが低下しますか?

多分。constオブジェクトが実際にあるときに値を格納するためにキャスト アウェイすると、const未定義の動作が発生します。未定義の動作は、とりわけパフォーマンス ヒットとして現れる可能性があります。

于 2012-12-13T23:20:12.743 に答える