C++ 持久类变量

C++ 持久类变量,c++,static,initialization,C++,Static,Initialization,我有一个关于静态变量的问题,或者其他一些方法 我有一门大师课,PatternMatcher。根据使用的matcher,我有几个派生单位。现在每个子类都需要存储一个浮点向量,但在每个类中它是常量。该向量的数据在初始化过程中读取,大小可达1GB(我拥有的最小值为1MB,最大值为1GB)。 例如,当我有两个Matcher_A实例时,它将分配两倍的内存。我事先不知道将使用哪些匹配器(每次运行将使用三个匹配器,您可以多次使用同一个匹配器)。我不希望在运行时检查想要的匹配器是否已经在某个地方初始化,因为这需

我有一个关于静态变量的问题,或者其他一些方法

我有一门大师课,PatternMatcher。根据使用的matcher,我有几个派生单位。现在每个子类都需要存储一个浮点向量,但在每个类中它是常量。该向量的数据在初始化过程中读取,大小可达1GB(我拥有的最小值为1MB,最大值为1GB)。 例如,当我有两个Matcher_A实例时,它将分配两倍的内存。我事先不知道将使用哪些匹配器(每次运行将使用三个匹配器,您可以多次使用同一个匹配器)。我不希望在运行时检查想要的匹配器是否已经在某个地方初始化,因为这需要为我所做的每一个更改编写额外的代码

目前,我将3个匹配器分配为

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
at

static
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),这很好。再次感谢!