什么是使用之间的性差异:全局静态变量vs函数中的静态变量?
static Foo foo;
// ...
foo.func();
和:
Foo& GetFoo(void)
{
static Foo foo;
return foo;
}
// ...
GetFoo().func();
哪个更好?
什么是使用之间的性差异:全局静态变量vs函数中的静态变量?
static Foo foo;
// ...
foo.func();
和:
Foo& GetFoo(void)
{
static Foo foo;
return foo;
}
// ...
GetFoo().func();
哪个更好?
主要区别在于施工发生时。在第一种情况下,它在main()
开始之前的某个时间发生。在第二种情况下,它在第一次致电GetFoo()
期间发生。
在第一种情况下,代码在其初始化之前(非法)使用foo
是可能的。在第二种情况下这是不可能的。
虽然意图是正确的,但在足够的努力下,您可以在初始化之前使用函数static(在C++ 03中)对函数进行递归调用。 –
A GetFoo
通常用于不希望复制类/对象的情况。 例如:
class Foo
{
private:
Foo(){};
~Foo();
public:
static Foo* GetFoo(void)
{
static Foo foo;
return &foo;
}
int singleobject;
};
您可以通过外部Foo::GetFoo()->sinlgeobject
访问singleobject
。私有的构造函数和析构函数可以避免你的类获得创建的副本。
对于static Foo foo
的使用,您必须声明公共构造函数,这意味着您总是通过它访问您的类,但是您的类也将能够获得副本。
使用全局变量可能会导致命名冲突。 – VoidStar
请参阅http://stackoverflow.com/questions/12186857/on-local-and-global-static-variables-in-c。 –
延迟初始化。 – iammilind