基类中的const与派生类中的static const

时间:2013-06-18 07:08:57

标签: c++ visual-c++ compiler-optimization

您认为在以下两种情况下性能/内存利用率之间是否会有任何差异?编译器是否会优化第一段代码以使两者之间没有任何区别。

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
    …
    …
}

vs

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

2 个答案:

答案 0 :(得分:3)

非静态类成员,即使const,也必须是该类的每个对象的一部分。因此,假设至少创建了两个实例,第二个定义将使用更少的内存。

修改

内存使用率和代码重复性很小的解决方案如下:

// In one header
template <int version>
class VersionBase
{
public:
  int GetVersion() const { return s_version; };
private:
  static const int s_version;
};

template <int version>
const int VersionBase::s_version = version;


// Anywhere, using the header above
class SomeVersionedDataObject : public VersionBase<2>
{
  :::
};

答案 1 :(得分:1)

我自己处理了一系列的序列化,我找到了不同的东西(并将继承权抛到窗外):

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

内存占用量相当于static int const version的内存占用量,除了version方法的实现可以更加聪明(即,您可以拥有多态类的版本)发送到virtual方法,...)。

当然,为那些不需要的对象提供默认版本非常容易:

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

我更喜欢在一些基类中编码信息,因为我可以用它来扩展任何类而无需修改类本身