您认为在以下两种情况下性能/内存利用率之间是否会有任何差异?编译器是否会优化第一段代码以使两者之间没有任何区别。
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;
}
答案 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; }
我更喜欢在一些基类中编码信息,因为我可以用它来扩展任何类而无需修改类本身。