2

我的问题与样式和基本效率有关,如果有区别的话,对于有效的静态成员变量。

考虑:

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

在这两种情况下,我都可以写(在 main() 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)

在选择使用一种风格或另一种风格时,是否有我遗漏的考虑?

在此先感谢,-杰

编辑

class C {
public:
   static constexpr int const_m = 13;
   static constexpr int const_n = 17;
};

确保const_m编译时可用。

4

2 回答 2

3

例如,我不相信您可以使用static const来调整数组的大小,因为它们在技术上不是编译时常量。

于 2013-06-08T21:30:12.673 回答
3

这里的两种选择的效率肯定是一样的。它们是“编译时常量”,因此编译器将能够直接使用该值而无需复杂化。

至于从样式的角度来看哪个“更好”,我认为这实际上取决于您要实现的目标以及常量的含义。如果您有许多密切相关的不同常量,枚举绝对是我的选择,如果它只是一个独立的常量(或)static const int,则更有意义。max_sizemagic_file_marker_value

正如在另一个答案中所触及的那样,可能会出现 astatic const int something = ...;不是编译时间常数的情况 - 例如

static const time_t seed = time(NULL);

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

于 2013-06-08T21:34:21.520 回答