Как вы думаете, будет ли какая-либо разница между использованием производительности/памяти в следующих двух случаях? Будет ли компилятор оптимизировать первый кусок кода, чтобы не иметь разницы между ними.const в базовом классе vs 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
…
…
}
против
class SomeVersionedDataObject
{
public:
VersionedDataObject()
int GetVersion() const { return m_iVersion; };
private:
static const int m_iVersion = 2;
}
«Будет ли компилятор оптимизировать первую часть кода, чтобы не иметь никакого значения между этими двумя». - Возможно, в некоторых специально сконструированных тестах, но в целом, почему вы думаете, что это возможно? Они не означают одно и то же, и, по крайней мере, все, что прямо или косвенно зависит от 'sizeof (VersionBase)', будет вести себя по-другому, а * любое использование 'SomeVersionedDataObject' почти наверняка будет квалифицироваться как зависящее от' sizeof (VersionBase) '. – hvd
Следует отметить, что оба они всегда инициализируются константой say '2', как в коде. Таким образом, вопрос в том, должен ли компилятор быть достаточно умным, чтобы понять, что m_iVersion будет хранить одно и то же значение для всех копий объекта, а также сделать магию и не выделять память для переменной в каждой копии объекта? (Читая это снова, я думаю, что я понял, как оптимизация компилятора работает неправильно, но тогда нет никаких глупых вопросов!) – NVM
@NVM Компилятор здесь не может работать. 'sizeof (VersionBase)' должен быть одинаковым во всей программе, и ничто не мешает вам создавать экземпляр 'VersionBase' напрямую, со многими разными значениями' m_iVersion'. Невозможно переместить 'const int' из объекта. – Angew