2013-05-06 3 views
3

Для POD локального для функции-члена класса:статического сопзЬ POD против Const POD

Есть ли основание предпочесть static const int ONE = 1; или const int ONE = 1?

Есть ли основания, чтобы предпочесть static const float HALF = (float)0.5; или const float HALF = (float)0.5.

например. для функции f в классе A

#ifdef SP 
#define float REAL 
#else 
#define double REAL 
#endif 

double 
A::f(const REAL x) 
{ 
    static const REAL HALF = (REAL)0.5; 
    return max(x, HALF); 
} 

or 

double 
A::f(const REAL x) 
{ 
    const REAL HALF = (REAL)0.5; 
    return max(x, HALF); 
} 

or 

double 
A::f(const REAL x) 
{ 
    const REAL HALF = 0.5f; 
    return max(x, HALF); 
} 

ответ

1

внутри функции/метода равнине const переменная может, например, быть вычислены из параметров и назначены разные значения в пределах соответствующих вызовов функции/метода, в то время как static const можно инициализируется только один раз (возможно, из параметров), а последующие вызовы просто не влияют на его значение. Чтобы проиллюстрировать эту разницу, взгляните на следующую демо:

#include <iostream> 

using std::cout; 
using std::endl; 

void 
non_static_case(int x, int y) { 
    const int z = x + y; 

    cout << z << endl; 
} 

void 
static_case(int x, int y) { 
    static const int z = x + y; 

    cout << z << endl; 
} 

int 
main() { 
    non_static_case(1, 2); 
    non_static_case(3, 4); 

    cout << endl; 

    static_case(1, 2); 
    static_case(3, 4); 
} 

Выход:

3 
7 

3 
3 

Вы можете ясно видеть, что z внутри функции static_case, после инициализации для 1-й раз, не делает изменение при последующих вызовах.

Следует отметить, что обычно компиляторы используют скрытый флаг, чтобы указать, была ли инициализирована локальная переменная static. Этот флажок проверяется на каждой записи функции, и это приводит к небольшим накладным расходам. Тем не менее, в этом конкретном случае , когда рассматриваются только примитивные типы, и переменная назначается константе времени компиляции, я не сомневаюсь, что полученный код будет оптимизирован компилятором и фактически не будет использоваться скрытый флаг. В результате я бы сказал, что есть нет причин предпочитать один подход над другим, в данном конкретном случае.

В случае, если переменная является членом какого-либо класса, применяются те же правила, что и для переменной внутри функции/метода. Член const может быть вычислен в списке инициализации конструктора и связан с конкретным экземпляром класса, тогда как static const один устанавливается во время инициализации запуска программы и остается неизменным для остальной части исполнения и равен «общий» среди всех экземпляры класса.

+0

Правда, ясно, что статическая квалификация препятствует переназначению. В исходном вопросе возникает вопрос, есть ли причина предпочесть «static const POD» или «const POD» для переменных, которые являются локальными для функции класса, которые всегда оцениваются с одинаковым значением. –

+0

@Alan: Хорошая точка, обновлено. –

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