C++11 什么时候应该使用静态数据成员与常量全局变量?

C++11 什么时候应该使用静态数据成员与常量全局变量?,c++11,global-variables,declaration,static-members,linkage,C++11,Global Variables,Declaration,Static Members,Linkage,事实证明,声明常量全局变量对于确定API的某些功能参数非常有用。例如,在我的API上,数值精度运算符的最小阶数为2;因此,我宣布: const int kDefaultOrderAccuracy{2}; 作为一个全局变量。将其设置为描述这些运算符的类的静态常量公共数据成员是否更好?一般来说,什么时候最好选择一个而不是另一个?我的猜测是: const根据数据值的大小占用内联内存,例如每次使用的“mov ah,const value”,这可能是一个非常短的命令,总体大小,总体大小,基于输入值。 而

事实证明,声明常量全局变量对于确定API的某些功能参数非常有用。例如,在我的API上,数值精度运算符的最小阶数为2;因此,我宣布:

const int kDefaultOrderAccuracy{2};
作为一个全局变量。将其设置为描述这些运算符的类的
静态常量
公共数据成员是否更好?一般来说,什么时候最好选择一个而不是另一个?

我的猜测是: const根据数据值的大小占用内联内存,例如每次使用的“mov ah,const value”,这可能是一个非常短的命令,总体大小,总体大小,基于输入值。
而静态值占用了一个完整的数据类型,通常是int,无论当前系统上每个静态值占用的数据类型是什么,可能更多,另外它可能需要一个完整的内存访问值来访问数据,例如mov ah,[内存指针],对于每次使用,它通常是系统上int的大小(对于完整的类,它可能更复杂)。但是静态仍然声明为const,因此其行为可能与普通const类型相同。

上下文始终很重要

  • 回答这样的问题
  • 也是为了给自己命名
如果您作为一个读者(共同编码者)需要猜测标识符的含义,那么您开始寻找更多的上下文,这可能通过API文档得到支持,通常包含在IDE中。但是,如果您没有提供一个非常好的API文档(我从您的问题中阅读了这个文档),那么您得到的唯一上下文就是查看声明的位置

在这里,您可能对包含库、子目录、文件、名称空间或类的名称感兴趣,最后一个问题是所使用的类型

如果我阅读
kdefaultorderaccurity
,我会看到很多上下文编码(默认、订单、准确性),其中订单可能与销售或排序相关,而
k
编码对我来说没有任何意义。只是为了让你从不同的角度看待你的实际问题。C/C++标识符的语法很差:它们仅限于复合词的规则

全局标识符的这种限制是我主要避免全局变量,甚至常量,有时甚至类型的最重要原因。如果其含义仅限于给定的上下文,则在该上下文中正确定义某事物。有时,您必须首先创建此上下文

您的解释包含一些未使用的上下文:

  • 数值运算符
    • 最小精度(顺便说一句:最小值并不意味着默认值)
将定义放置到正确的类中的问题与为全局类找到正确的位置的问题没有太大区别:您必须找到/创建正确的头文件(和/或命名空间)

作为旁注,您可能有兴趣了解,它还可以用于获取廉价的编译时常量,枚举也可以放入类(或类)中。a也是在引入全局常量之前应该考虑的选项。与封闭类定义一样,
是一种标点符号,它分隔了
\uu
或单词中的
caseChange

增编: 如果您对提供用户可以覆盖的有用的操作默认行为感兴趣,可以选择。如果您的API提供了运算符,那么您应该研究标准I/O流的运算符是如何工作的

const int kDefaultOrderAccuracy{2};
是静态变量的声明:
kdefaultorderaccurity
具有内部链接。将带有内部链接的名称放在标题中显然是一个非常糟糕的主意,这使得在相同或其他标题中带有外部链接的其他代码中极易违反一个定义规则(ODR),特别是当名称用于内联或模板函数体时:

f.hpp内部:

template <typename T>
const T& max(const T &x, const T &y) {
  return x>y ? x : y;
}

inline int f(int x) {
  return max(kDefaultOrderAccuracy, x); // which kDefaultOrderAccuracy?
}
程序中只有一个
常量::kdefaultOrderAccurance

还可以使用命名空间级别的全局常量对象:

extern const int kDefaultOrderAccuracy;

这并不能回答这个问题。一旦你有足够的钱,你将能够;相反我要求的是什么澄清?我唯一不确定的是const static是如何处理的。他们提供更多的信息不会给我提供我不确定的信息。如果const static的处理方式与const相同,则差异没有意义(或没有差异),如果const static的处理方式更复杂,如前所述,则const static会增加额外的开销。坚持使用const不会比使用const static增加移动开销(至少我希望不会),但是使用const static可能会更自然。你能多说几句关于已证明对确定某些功能参数有用的内容吗?。。。默认参数呢?这取决于您的API,但我认为一种常见的方法如下。如果只在一个类中使用,则将其设置为静态数据成员或成员
enum
。如果在整个API中使用,请使用宏或枚举,f.ex<代码>枚举类OrderAccurance{kDefault=2,/*…*/}。
k
字母是匈牙利符号中常量的常见前缀,因此大多数开发人员都可以理解。
k
字母没有添加有关含义/上下文/分组的信息。
extern const int kDefaultOrderAccuracy;