您认为在以下两种情况下性能/内存利用率之间会有什么区别吗?编译器是否会优化第一段代码,以便两者之间没有任何区别。基类中的const与派生类中的static const
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;
}
“编译器是否会优化第一段代码,以便两者之间没有任何区别。” - 在一些特殊构造的测试中,也许,但一般来说,你为什么认为这甚至是可能的?它们并不意味着同样的事情,并且至少,任何直接或间接依赖于sizeof(VersionBase)的行为都会有所不同,并且* SomeVersionedDataObject的使用几乎可以肯定地取决于sizeof( VersionBase)'。 – hvd
需要注意的是,两者总是以代码中的常数“2”来初始化。所以问题是编译器是否足够聪明,可以认识到m_iVersion将为对象的所有副本保持相同的值,因此需要一些魔力,并且不要为每个对象副本中的变量分配内存? (再读一遍,我想我已经得到了编译器优化是如何工作的所有错误,但是没有愚蠢的问题!) – NVM
@NVM编译器在这里无法真正发挥魔力。 'sizeof(VersionBase)'在整个程序中必须是相同的,并且没有任何东西阻止你直接实例化'VersionBase',并且有许多不同的'm_iVersion'值。没有办法将'const int'移出对象。 – Angew