2013-06-08 7 views
2

Мой вопрос, связанный с стилем и базовой эффективностью, если есть разница вообще, для эффективных статических переменных-членов.Элемент константы-константы класса 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 является время компиляции доступной.

+1

Более современное сравнение было бы 'static constexpr' вместо' static const'. – GManNickG

+0

Это очень приятно. Очень ясно. Я собираюсь изменить свой вопрос ... – JayInNyc

ответ

3

Я не верю, что вы можете использовать static const, чтобы, например, размер массива, потому что они технически не требуются, чтобы быть время компиляции константы.

+0

Он работает в 'gcc' с указанным выше классом C и добавляет массив класса' int arr [const_m]; 'к классу (и некоторые другие виды использования - просто убедитесь, что это не особый случай). –

+2

Если его инициализатор является константным выражением, то это значение является константным выражением. Таким образом, вы правы в целом, но в этом случае все в порядке. – GManNickG

+0

Mark, yours - хорошая точка, время выполнения компиляции - время (статическая нагрузка).Я не думал об этом. Матс, Ник, хорошие сборки. – JayInNyc

3

Эффективность, безусловно, должна быть одинаковой для двух вариантов. Они являются «константами времени компиляции», поэтому компилятор сможет использовать значение напрямую без осложнений.

Что касается «лучшего» с точки зрения стиля, я думаю, что это действительно зависит от того, чего вы пытаетесь достичь и каково значение констант. Enum - это, безусловно, мой выбор, если у вас есть несколько различных констант, которые тесно связаны между собой, где static const int имеет больше смысла, если это всего лишь одна автономная константа (max_size или magic_file_marker_value).

Как уже было сказано в другом ответе, возможно возникновение ситуации, когда static const int something = ...; не является постоянной времени компиляции - например,

static const time_t seed = time(NULL); 

Это не позволит вам затем использовать его там, где константа времени компиляции требуется [например, размеры массива], потому что, хотя это КОНСТАНТА со многих точек зрения, это не время компиляции известно значение.

+0

Благодарим вас за этот конкретный пример, недоступный для компиляции. – JayInNyc

Смежные вопросы