Мой вопрос, связанный с стилем и базовой эффективностью, если есть разница вообще, для эффективных статических переменных-членов.Элемент константы-константы класса C++
Рассмотрим:
class C {
public:
static const int const_m = 13;
static const int const_n = 17;
};
class D {
public:
enum : int { const_m = 13 };
enum : int { const_n = 17 };
};
В обоих случаях я могу написать (в главном() fcxn):
int main() {
int cm = C::const_m;
int cn = C::const_n;
int dm = D::const_m;
int dn = D::const_n;
}
поэтому результат тот же, и стиль кодирования выглядит одинаково. В классе C значение const_m будет помещено в статический раздел скомпилированного кода, а const_m будет ссылаться на адрес этого значения. В классе D перечисление является частью области памяти класса.
Я назвал g ++ -S на обоих этих классах и рассмотрел тривиальную функцию main() выше. Я также сделал это с -O0 и -O3, и я не вижу различий в коде asm. Основные опсы, которые соответствуют коде C++ выше:
movl $13, -4(%rbp)
movl $17, -8(%rbp)
movl $13, -12(%rbp)
movl $17, -16(%rbp)
Есть соображение, что я пропускаю при избрании использовать один стиль или другие?
Спасибо заранее, -Jay
Редактировать
class C {
public:
static constexpr int const_m = 13;
static constexpr int const_n = 17;
};
гарантирует, что const_m
является время компиляции доступной.
Более современное сравнение было бы 'static constexpr' вместо' static const'. – GManNickG
Это очень приятно. Очень ясно. Я собираюсь изменить свой вопрос ... – JayInNyc