【问题标题】:static const POD vs const POD静态 const POD 与 const POD
【发布时间】:2013-05-06 22:54:58
【问题描述】:

对于类成员函数的本地 POD:

有什么理由更喜欢static const int ONE = 1;const int ONE = 1

有什么理由更喜欢static const float HALF = (float)0.5;const float HALF = (float)0.5

例如对于A类中的函数f

 #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);
}

【问题讨论】:

    标签: c++ static constants


    【解决方案1】:

    在函数/方法中,普通的 const 变量可以例如从参数计算并在函数/方法的相应调用中分配不同的值,而 static const 只能初始化一次(可能from 参数),随后的调用对它的值没有影响。为了说明这种差异,请看以下演示:

    #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
    

    您可以清楚地看到static_case函数内部的z,在第一次初始化后,在随后的调用中不再改变。

    值得一提的是,编译器通常使用隐藏标志来指示本地static 变量是否已经被初始化。在函数的每个条目上都会检查此标志,这会导致很少的开销。然而,在这种特殊情况下,当仅考虑原始类型并将变量分配给编译时常量时,我毫不怀疑生成的代码会被编译器优化并且实际上没有隐藏标志用过的。因此,我想说,在这种特殊情况下,没有理由偏爱一种方法而不是另一种方法

    如果变量是某个类的成员,则实际上与函数/方法案例中的变量相同的规则适用。 const 成员可以在构造函数初始化列表中计算,并与类的特定实例相关联,而 static const 成员在程序启动初始化期间设置,并在其余执行期间保持不变,并且是 在类的所有实例之间“共享”

    【讨论】:

    • 没错,很明显静态限定可以防止重新分配。最初的问题是询问是否有理由更喜欢“静态 const POD”或“const POD”用于类函数的本地变量,这些变量总是评估为相同的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多