我的问题与样式和基本效率有关,如果有区别的话,对于有效的静态成员变量。
考虑:
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
编译时可用。