2

次の 2 つのケースで、パフォーマンス/メモリ使用率に違いがあると思いますか? コンパイラは、コードの最初の部分を最適化して、2 つのコードに違いがないようにします。

class VersionBase 
{
public:
    VersionBase(int iVer) : m_iVersion(iVer) {…}; 
    int GetVersion() const { return m_iVersion; };
private:
    const int m_iVersion;                                     
}

class SomeVersionedDataObject : VersionBase 
{
    VersionedDataObject() : VersionBase(2) {…}; //  Set version to whatever is the latest for the class
    …
    …
}

class SomeVersionedDataObject
{
public: 
    VersionedDataObject()
    int GetVersion() const { return m_iVersion; };
private:
    static const int m_iVersion = 2;
}
4

2 に答える 2

1

シリアライゼーションをかなり扱ったので、別の方法に落ち着きました (そして、ウィンドウから継承を放り出しました)。

inline int version(SomeVersionedDataObject const&) { return 2; }

メモリ フットプリントはケースのフットプリントと同等ですstatic int const versionが、メソッドの実装versionは自由に少し賢くすることができます (つまり、virtualメソッドにディスパッチするポリモーフィック クラスのバージョンを持つことができます...)。

そしてもちろん、まだ必要のないオブジェクトにデフォルト バージョンを提供するのは非常に簡単です。

int version(...) { return 0; }

クラス自体を変更せずに任意のクラスを拡張できるため、一部の基本クラスで情報をエンコードすることを好みます。

于 2013-06-18T10:40:08.143 に答える