我有关于静态变量的问题,或者其他一些方法。
我有一个大师类,PatternMatcher。根据使用的匹配器,我有几个派生单位。现在每个子类都需要存储一个浮点 vector ,但在每个类中它是常量。该 vector 的数据在初始化期间读取,大小可达 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 基本上是一个纯粹的虚拟类。
我一直认为静态意味着一个变量在不同的分配中是常量,但是当我将我的 vector 定义为静态时,我会得到一个链接器解析错误。在较早的迭代中,我将这些 vector 设置为全局 vector ,但更希望将它们本地化到它们的类中。
我需要使用哪些关键字才能使初始化的 vector 可用于下一次初始化?简单检查 vector 大小是否大于 0 就足够了,但每个对象都使用自己的 vector 。
最佳答案
static
关键字是一种方法 - 它可以为整个类存储成员的一个拷贝。您缺少的是编译模块中此类静态的实际声明,以便链接器可以使用它。例如:
头文件foo.h
:
struct Foo {
static int s_int;
}
源文件foo.cpp
:
#include "foo.h"
int Foo::s_int; // optionally =0 for initialization
第二部分很重要,因为这将为要用作静态成员的对象分配内存空间。
不过请记住:
static
成员将所有 在main()
之前初始化,这意味着您的 1GB 数据将无论是否有人使用过该特定类(class),都会被阅读- 您可以解决上述问题,但您必须检查数据加载和初始化是否在运行时发生
不过,您还有另一种选择。如果你“按原样”存储你的 float (即每个 32 位,二进制格式)你可以简单地将文件“映射”到内存空间并像它们已经加载一样访问它们 - 操作系统将负责加载需要时将适当的 4K 页面放入 RAM。
在 http://en.wikipedia.org/wiki/Mmap 阅读有关 mmap
的更多信息
关于c++ - 持久类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11825672/