c++类常值成员——风格
C++ class constant-value member -- style
对于有效的静态成员变量,我的问题与样式和底层效率有关,如果有区别的话。
考虑:
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_size
或magic_file_marker_value
)。
正如在另一个答案中提到的,有可能出现static const int something = ...;
不是编译时常数的情况-例如
static const time_t seed = time(NULL);
这将不允许您在需要编译时常量的地方使用它[例如数组大小],因为尽管从许多角度来看它是一个常量,但它不是编译时已知的值。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- Qt VTK交互风格的信号到小部件
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- c++类常值成员——风格
- 带有std::array的可变进模板结构体与c风格数组成员的区别
- 使用这个来引用类中的私有成员是一种好的风格吗?
- C++继承和受保护基类成员的访问:用Java风格做这件事是个坏主意吗
- 一种使用不同风格的私有成员的方法
- 使用const getter风格的函数代替静态数据成员