Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;静态变量_C++_Static - Fatal编程技术网

C++ C++;静态变量

C++ C++;静态变量,c++,static,C++,Static,我正在尝试设计只包含头的库,不幸的是,它需要全局静态变量(在类中或在命名空间中) 是否有任何方法或首选解决方案可以在维护仅标题设计的同时使用全局静态变量 代码是有几个选项。我首先想到的是,C++允许类模板的静态数据成员在一个以上的翻译单元中定义: template<class T> struct dummy { static int my_global; }; template<class T> int dummy<T>::my_global; in

我正在尝试设计只包含头的库,不幸的是,它需要全局静态变量(在类中或在命名空间中)

是否有任何方法或首选解决方案可以在维护仅标题设计的同时使用全局静态变量


代码是

有几个选项。我首先想到的是,C++允许类模板的静态数据成员在一个以上的翻译单元中定义:

template<class T>
struct dummy {
   static int my_global;
};

template<class T>
int dummy<T>::my_global;

inline int& my_global() {return dummy<void>::my_global;}

您可以将此内联函数放入头文件,并将其包含到许多翻译单元中。C++保证了这个内联函数返回的引用总是指向同一个对象。确保函数具有外部链接。

+1本地静态是处理全局数据的最简单方法,特别是因为新的C++0x标准将保证其正确初始化,即使在多线程应用程序中也是如此。我还应该补充的是,第二个变量有一个缺点-仅在第一次调用my_global时才初始化g。因此,编译器将在每个调用中插入比较、跳转和线程保护-这将使调用变慢(这在库入口点的情况下可能很重要)。@AlexEngy:在这种情况下,这是一个int,在动态初始化中,它可能会被静态初始化,而不会产生线程安全方面的开销。@sellibitze:yeap,对于普通int,内联my_global(带O3的icc)的组合对于这两个变体都是相同的。我只是希望人们在类型复杂时要小心(使用init检查的线程安全性非常昂贵)。
inline int& my_global() {
   static int g = 24;
   return g;
}