gpt4 book ai didi

C++ 静态常量成员变量用法

转载 作者:IT老高 更新时间:2023-10-28 12:59:12 27 4
gpt4 key购买 nike

假设我有一个需要一些常量才能运行的类。几个成员函数需要使用这些常量。不赞成使用#define,因为它会导致冲突。常量是 8 位或 16 位的十六进制模式,存储为 uint8_t 或 uint16_t。这些常量也不会因类的实例而异,因此只需保存一份常量拷贝即可节省内存(尽管内存很少)。

有什么不合适的,或者可能是更好的方法来完成上述操作,而不是简单地执行以下操作:

// mycode.h
// .......
class myclass {
private:
static const uint16_t kMyClassConstant_ = 0xBEEF;
// .......
};

提前感谢您的帮助。

最佳答案

鉴于您对情况的描述,我会说使用 static const 成员是一种好方法。在 C++11 中,您可能希望将其更改为 static constexpr 以强调它是编译时常量,尽管不会因此而有效地改变。

如果您在代码中的某处引用 myclass::kMyClassContant_,其方式与单一定义规则 (odr) 相关,尤其是。在需要引用(包括 const-reference)的上下文中,编译器会提示没有定义常量。在这种情况下,仅仅在类中声明和初始化它是不够的。这可能会迫使您将声明和定义分开:

// mycode.h
class myclass {
private:
static const uint16_t kMyClassConstant_;
};

// mycode.cpp
const uint16_t myclass::kMyClassConstant_ = 0xBEEF;

为了避免维护单独的声明和定义的麻烦,有些人更喜欢声明一个内联的 constexpr 函数而不是一个实际的变量:

// mycode.h
class myclass {
private:
static constexpr uint16_t kMyClassConstant_()
{ return 0xBEEF; }
};

对于许多与 odr 相关的问题,这是一种正确的解决方法,并且不会导致任何性能损失。它是否真的有用取决于维护普通静态常量的单独声明和定义的负担有多大。如果您希望常量永远不会随着代码的发展而改变,那么最好使用具有单独定义的普通静态常量。但是,如果您经常修改常量的定义,则必须重新编译定义文件并将其重新链接到项目的所有相关部分可能会使您认为上述基于函数的解决方案是更好的选择。

对数据类型的最后评论:如果您需要以紧凑的形式存储大量这些值,则使用 std::uint16_t 将其强制为 16 位可能很有用。否则,实际大小可能并不重要,在这种情况下 std::uint_fast16_t(可能大于 16 位)可能会更好。

关于C++ 静态常量成员变量用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17056882/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com