C ++类常量值成员 - 样式

时间:2013-06-08 21:25:03

标签: c++ static enums

我的问题与风格和基本效率有关,如果存在差异,对于有效的静态成员变量。

考虑:

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编译时可用。

2 个答案:

答案 0 :(得分:3)

我不相信你可以使用static const来确定数组的大小,因为从技术上讲它们不是编译时常量。

答案 1 :(得分:3)

这里的两个选择的效率肯定是相同的。它们是编译时间常数",因此编译器将能够直接使用该值而无需复杂化。

至于哪个更好"从风格的角度来看,我认为这实际上取决于你想要实现的目标以及常量的含义。如果你有许多紧密相关的不同常数,那么枚举绝对是我的选择,static const int如果它只是一个单独的常量max_size则更有意义。magic_file_marker_valuestatic const int something = ...;)。

如在另一个答案中所提到的那样,可能会出现static const time_t seed = time(NULL); 不是编译时常数的情况 - 例如

{{1}}

这不允许您在需要编译时常量的地方使用它[例如数组大小],因为尽管它从许多角度来看都是常量,但它不是编译时已知的值。