用C静态全局变量++(Static global variables in C++)

2019-07-18 06:50发布

我想通过malloc的方法,使整数数组。 我想这个数组是全球性的,并可以在我的程序的任何地方使用。 我把代码看起来像这样一个头文件:

static int *pieces;

然后,我有一个与我想在那里数来填充它的功能。 该功能在一个命名空间和命名空间在自己的.cpp文件中实现。 不过,我导入头文件到main.c中并调用从创建像阵列命名空间中的功能:

pieces = malloc(sizeof(int) * 128);

但是,当我尝试访问数字阵列中的主(调用创建我的阵列功能后),它崩溃并说个未初始化。 但是在功能我有我可以创建它,在它就好了操纵数字。 我的印象是,通过使片一个静态变量,当有一些功能改变的任何地方(或设置它),那么将影响变量的使用在任何地方。 基本上我想说的是为什么会出现碎片未设置在主,即使我把它在一个函数,我叫什么名字?

Answer 1:

Static与许多含义的关键词,在这种特殊情况下,这意味着不是全球 (意译)

这意味着,每一个.cpp文件都有自己的变量副本 。 因此,当你在初始化main.cpp它只是在初始化main.cpp 。 其他文件有它仍然未初始化的。

解决这个问题的第一件事是删除关键字static 。 这将导致“多定义问题”。 为了解决这个问题,你应该在定义变量.cpp文件和公正的extern声明它的头文件。


编辑:你只是分配内存吧, 那并不算作初始化 。 您需要分配后的内存初始化为0。

您可以使用new int[128]()而不是你更详细malloc的语法,而这将进行初始化呢? 或者你也可以采取简单的道路(那有什么它),并使用std::vector



Answer 2:

关键是这样的:

static int *pieces;

你说你把你的头。 这不是导出符号的方式。 包括头的任何文件将获得称为未初始化的指针自身的静态版本pieces

相反,你把这个在你的头:

extern int *pieces;

extern int init_pieces();

而在源文件中,你这样做:

static const size_t num_pieces = 128;

int *pieces = 0;

int init_pieces()
{
    pieces = malloc( num_pieces * sizeof(int) );
    return pieces != NULL;
}

现在,当你有你的头,你的源文件就知道让pieces从别的地方,并会等待连接到哪里工作。 我还建议用于阵列的“初始化”功能。 我没有把中,“释放”的功能,但是。

请注意,这是所有的C,而不是C ++。 如果您使用C ++,你真的应该使用new或者更好的是,使用vector

另外,在C ++使用静力学时,记住这一: C ++静态初始化顺序



Answer 3:

有关各种架构高性能的代码,你可能想要一个malloc-Y分配,而不是普通的新。 那是因为你会喜欢的东西mymalloc(把它包),然后使用架构相关的功能,诸如实现适当对齐,以避免高速缓存未命中,做硬件制造商,如IBM(蓝基)提供的其他时髦的东西的人或英特尔(MIC)。 所有这些优化的分配程序的有malloc的类型框架。



Answer 4:

在C ++ 17标准,你可以使用inline说明符,而不是静态的。 对于变量,这意味着每个对象单位将有变量的副本,但连接器将只能选择其中之一。 或者,正如上注明cppreference :

内联函数或内嵌变量(因为C ++ 17)具有以下性质:

1)可以存在多于一个内联函数或变量的一个定义(因为C ++ 17)在程序中,只要每个定义出现在一个不同的翻译单元和(对于非静态内联函数和变量(因为C + 17))的所有定义是相同的。 例如,内联函数或内嵌变量(因为C ++ 17)可以在头文件是在多个源文件#include'd来限定。

2)内联函数或变量的定义(自C ++ 17)必须存在在其被访问(不一定接入点之前翻译单元)。

3)一种内联函数或变量(因为C ++ 17)与外部连接(例如未声明静态)具有以下附加性能:

 1) It must be declared inline in every translation unit. 2) It has the same address in every translation unit. 

支持( 源 ):

  • MSVC因为版本19.12(2017年VS 15.5)
  • GCC 7
  • 锵3.9
  • ICC 18.0

在这种情况下,它意味着你可以更换

static int *pieces;

inline int *pieces;


文章来源: Static global variables in C++