我的问题与风格和基本效率有关,如果存在差异,对于有效的静态成员变量。
考虑:
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
编译时可用。
答案 0 :(得分:3)
我不相信你可以使用static const
来确定数组的大小,因为从技术上讲它们不是编译时常量。
答案 1 :(得分:3)
这里的两个选择的效率肯定是相同的。它们是编译时间常数",因此编译器将能够直接使用该值而无需复杂化。
至于哪个更好"从风格的角度来看,我认为这实际上取决于你想要实现的目标以及常量的含义。如果你有许多紧密相关的不同常数,那么枚举绝对是我的选择,static const int
如果它只是一个单独的常量max_size
则更有意义。magic_file_marker_value
或static const int something = ...;
)。
如在另一个答案中所提到的那样,可能会出现static const time_t seed = time(NULL);
不是编译时常数的情况 - 例如
{{1}}
这不允许您在需要编译时常量的地方使用它[例如数组大小],因为尽管它从许多角度来看都是常量,但它不是编译时已知的值。