c++类常值成员——风格

C++ class constant-value member -- style

本文关键字:风格 成员 常值 c++      更新时间:2023-10-16

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

考虑:

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

在这两种情况下我都可以写(In a 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()函数。我也用- 0和-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在编译时可用。

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

对于这里的两个选择,效率应该是相同的。它们是"编译时间常量",因此编译器将能够直接使用该值而不复杂。

至于从风格的角度来看哪个"更好",我认为这真的取决于你想要达到的目标和常量的含义。枚举绝对是我的选择,如果你有许多不同的常数密切相关,其中static const int更有意义,如果它只是一个单一的,独立的常数(max_sizemagic_file_marker_value)。

正如在另一个答案中提到的,有可能出现static const int something = ...;不是编译时常数的情况-例如

static const time_t seed = time(NULL);

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