C++ 持久类变量
我有一个关于静态变量的问题,或者其他一些方法 我有一门大师课,PatternMatcher。根据使用的matcher,我有几个派生单位。现在每个子类都需要存储一个浮点向量,但在每个类中它是常量。该向量的数据在初始化过程中读取,大小可达1GB(我拥有的最小值为1MB,最大值为1GB)。 例如,当我有两个Matcher_A实例时,它将分配两倍的内存。我事先不知道将使用哪些匹配器(每次运行将使用三个匹配器,您可以多次使用同一个匹配器)。我不希望在运行时检查想要的匹配器是否已经在某个地方初始化,因为这需要为我所做的每一个更改编写额外的代码 目前,我将3个匹配器分配为C++ 持久类变量,c++,static,initialization,C++,Static,Initialization,我有一个关于静态变量的问题,或者其他一些方法 我有一门大师课,PatternMatcher。根据使用的matcher,我有几个派生单位。现在每个子类都需要存储一个浮点向量,但在每个类中它是常量。该向量的数据在初始化过程中读取,大小可达1GB(我拥有的最小值为1MB,最大值为1GB)。 例如,当我有两个Matcher_A实例时,它将分配两倍的内存。我事先不知道将使用哪些匹配器(每次运行将使用三个匹配器,您可以多次使用同一个匹配器)。我不希望在运行时检查想要的匹配器是否已经在某个地方初始化,因为这需
PatternMatcher* a = new PMMatcherA();
PatternMatcher* b = new PMMatcherB();
PatternMatcher* c = new PMMatcherC();
,但由于它们是用户选择的,因此可能会发生A和C是相同的情况,例如。当我通过typeid(a).name()运行检查时代码>,它会给我PatternMatcher作为结果,不管我用什么类初始化。PatternMatcher基本上是一个纯粹的虚拟类
我一直认为static意味着变量在不同的分配中是常量,但当我将向量定义为static时,我会得到一个链接器解析错误。在早期的迭代中,我将这些向量设置为全局向量,但更希望将它们本地化到它们的类中
我需要使用哪些关键字才能使初始化时的向量在下次初始化时可用?简单检查向量大小是否大于0就足够了,但每个对象都使用自己的向量。是的,静态
是您需要的。您可以这样使用它:
class MyClass
{
private:
static std::vector< float > data_;
};
std::vector< float > MyClass::data_;
或通过类名:
MyClass::data\uu.push\u back(0)代码>是的,静态
是您所需要的。您可以这样使用它:
class MyClass
{
private:
static std::vector< float > data_;
};
std::vector< float > MyClass::data_;
或通过类名:
MyClass::data\uu.push\u back(0)
静态
关键字是一种方法,它将为整个类存储一个成员的一个副本。您缺少的是编译模块中此类静态的实际声明,以便链接器可以使用它。例如:
头文件foo.h
:
struct Foo {
static int s_int;
}
源文件foo.cpp
:
#include "foo.h"
int Foo::s_int; // optionally =0 for initialization
第二部分非常重要,因为这将为要用作静态成员的对象分配内存空间
但是,请记住:
静态
成员将在main()
之前初始化所有,这意味着无论是否有人使用该特定类,都将读取1GB的数据
- 您可以解决上述问题,但随后必须检查数据加载和初始化是否在运行时发生
不过,你还有另一个选择。如果您“按原样”(即每个浮点32位,二进制格式)存储浮点数,您只需将文件“映射”到内存空间,并像已加载一样访问它们—操作系统将在需要时负责将适当的4K页面加载到RAM中
阅读更多关于mmap
atstatic
keyword是一种方法,它将为整个类存储一个成员的一个副本。您缺少的是编译模块中此类静态的实际声明,以便链接器可以使用它。例如:
头文件foo.h
:
struct Foo {
static int s_int;
}
源文件foo.cpp
:
#include "foo.h"
int Foo::s_int; // optionally =0 for initialization
第二部分非常重要,因为这将为要用作静态成员的对象分配内存空间
但是,请记住:
静态
成员将在main()
之前初始化所有,这意味着无论是否有人使用该特定类,都将读取1GB的数据
- 您可以解决上述问题,但随后必须检查数据加载和初始化是否在运行时发生
不过,你还有另一个选择。如果您“按原样”(即每个浮点32位,二进制格式)存储浮点数,您只需将文件“映射”到内存空间,并像已加载一样访问它们—操作系统将在需要时负责将适当的4K页面加载到RAM中
阅读有关mmap的更多信息
当我将向量定义为静态时,我将得到一个链接器解析
错误
这是因为您声明了静态变量(在头文件中),但从未在实现文件(.cpp)中显式初始化它
例如:
//AClass.h
class AClass
{
private:
static std::vector<int> static_vector;
};
//AClass.h
类AClass
{
私人:
静态std::向量静态_向量;
};
在.cpp实现文件中:
std::vector<int> AClass::static_vector;
std::vector AClass::static_vector;
当我将向量定义为静态时,我将得到一个链接器解析
错误
这是因为您声明了静态变量(在头文件中),但从未在实现文件(.cpp)中显式初始化它
例如:
//AClass.h
class AClass
{
private:
static std::vector<int> static_vector;
};
//AClass.h
类AClass
{
私人:
静态std::向量静态_向量;
};
在.cpp实现文件中:
std::vector<int> AClass::static_vector;
std::vector AClass::static_vector;
谢谢,成功了。只有在第一次调用匹配器之后,向量本身才会与数据叠加,因此最初每个向量都只有sizeof(vector),这很好。再次感谢!谢谢,成功了。只有在第一次调用匹配器之后,向量本身才会与数据叠加,因此最初每个向量都只有sizeof(vector),这很好。再次感谢!