您認爲在以下兩種情況下性能/內存利用率之間會有什麼區別嗎?編譯器是否會優化第一段代碼,以便兩者之間沒有任何區別。基類中的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