我想通过malloc的方法,使整数数组。 我想这个数组是全球性的,并可以在我的程序的任何地方使用。 我把代码看起来像这样一个头文件:
static int *pieces;
然后,我有一个与我想在那里数来填充它的功能。 该功能在一个命名空间和命名空间在自己的.cpp文件中实现。 不过,我导入头文件到main.c中并调用从创建像阵列命名空间中的功能:
pieces = malloc(sizeof(int) * 128);
但是,当我尝试访问数字阵列中的主(调用创建我的阵列功能后),它崩溃并说个未初始化。 但是在功能我有我可以创建它,在它就好了操纵数字。 我的印象是,通过使片一个静态变量,当有一些功能改变的任何地方(或设置它),那么将影响变量的使用在任何地方。 基本上我想说的是为什么会出现碎片未设置在主,即使我把它在一个函数,我叫什么名字?
Static
与许多含义的关键词,在这种特殊情况下,这意味着不是全球 (意译)
这意味着,每一个.cpp
文件都有自己的变量副本 。 因此,当你在初始化main.cpp
, 它只是在初始化main.cpp
。 其他文件有它仍然未初始化的。
解决这个问题的第一件事是删除关键字static
。 这将导致“多定义问题”。 为了解决这个问题,你应该在定义变量.cpp
文件和公正的extern声明它的头文件。
编辑:你只是分配内存吧, 那并不算作初始化 。 您需要分配后的内存初始化为0。
您可以使用new int[128]()
而不是你更详细malloc
的语法,而这将进行初始化呢? 或者你也可以采取简单的道路(那有什么它),并使用std::vector
关键是这样的:
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 ++静态初始化顺序
有关各种架构高性能的代码,你可能想要一个malloc-Y分配,而不是普通的新。 那是因为你会喜欢的东西mymalloc(把它包),然后使用架构相关的功能,诸如实现适当对齐,以避免高速缓存未命中,做硬件制造商,如IBM(蓝基)提供的其他时髦的东西的人或英特尔(MIC)。 所有这些优化的分配程序的有malloc的类型框架。
在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;