【发布时间】:2014-12-24 09:30:33
【问题描述】:
下面的静态是否有意义(我来自 Java 背景)?它可以编译,但约定/标准是什么?
#ifndef FUNC_H
#define FUNC_H
int func(const int& x, const int& y);
//cache frequently used values
const static int a = func(2, 0);
const static int b = func(3, 0);
#endif // FUNC_H
【问题讨论】:
-
假设这是一个头文件,每个
static变量的唯一副本将在包含此头文件的每个源文件中实例化。假设func为相同的输入返回相同的输出,所有这些实例在不同的源文件中都是相同的。而且由于这些变量是只读的,因此实例化它们的不同副本并初始化为相同值是没有意义的。底线 -static是多余的。 -
另一方面,如果你在多个源文件中包含这个头文件,那么你会得到没有
static的链接错误。我会声明它们extern而不是static,并在其中一个源文件而不是头文件中初始化它们(通过调用func)。 -
顺便说一句:看到内置类型不必要地传递为
const&而不是按值传递确实很少见。 -
@Deduplicator 所以通过引用而不是值传递内置类型没有性能提升?
-
很少有内置类型比桌面系统上的指针大(嵌入式平台上更多)。对于那些,有时,不复制它们可能会有好处。虽然这种情况很少见,但由于间接、混叠等方面的成本。