有些东西让我烦恼。
在非线程程序中,最好是使用本地静态变量(内部方法)还是静态类成员?
在这个例子中:
class C{
public:
C(){};
void foo();
};
void C::foo(){
static int bar = 0;
bar++;
printf("%d\n",bar);
}
如果在bar
中仅使用C::foo()
会不会被视为不良做法?
答案 0 :(得分:7)
两者都不是更好。它们提供非常不同的用例
答案 1 :(得分:4)
我通常会尝试尽可能地限制变量的范围,只要它不会变得奇怪或乏味。
如果class C
中有1000行代码,其中函数foo
中包含100行代码,则对bar
所做的任何更改(例如,更改名称或type)需要超过100行代码才能确保更改正常。如果你有一个静态类成员bar
,你可能需要超过1000行代码,以确保在那里不使用bar
。这将是浪费时间。
如果您认为在其他功能bar
中可能需要foo2
(例如,在计算foo
和foo2
的通话计数时),您可能需要制作bar
一个静态类成员。
答案 2 :(得分:2)
如果它是公共类,则静态类成员需要编辑头文件。这并不总是令人满意的。
另一个选项是匿名命名空间中的文件范围变量。如果您只需要在一种方法中访问,并且如果您需要多次访问,这就足够了。
答案 3 :(得分:0)
面向对象,bar是C类的状态的一部分。这就是我通常喜欢使用字段而不是静态局部变量的原因。
答案 4 :(得分:0)
本地和非本地全球变量都因全球化而“糟糕”。但是这两种情况的初始化和访问是不同的,因此使用的答案取决于您对这些要求的需求。
作为旁注,具有静态存储持续时间的局部变量的动态初始化可能不是线程安全的,具体取决于您的编译器。好消息,在C ++ 0x中,它保证是线程安全的。
答案 5 :(得分:0)
我认为将 static
成员用于除 const
值(不符合 constexpr
的条件)以外的任何内容是一种不好的做法。静态成员或本地方法的范围是全局,它恰好只能由类(的所有实例)访问。
非常量类静态是我的不良做法列表的顶部。这比简单地声明一个全局变量更糟糕——因为它是隐藏的。单例类(或者甚至只是一个只构造一次并传递给依赖类的类)消除了这种做法。
但除此之外,我会建议通过全局访问器公开静态(带有大量丑陋的注释)。如果代码在任何时候变得并发,您可以放入临界区。
// Danger, global state.
int inc_bar()
{
static int bar = 0;
return bar++;
}
class my_class
{
public:
my_class()
{
}
void inc()
{
printf("%d\n", inc_bar());
}
};