c++ - 持久类变量

标签 c++ static initialization

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

我有一个大师类,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/

相关文章:

java - 静态方法中变量的永久更改

c# - 通过动态方法获取静态字段的值

c++ - 分配指针时出现段错误

Python 在类定义中实例化类

c# - 如果我将这个序列作为参数传递,我应该检查序列长度吗?

c++ - STL - 复制混合容器

c++ - 使用字符串流获取行分隔符

c++ - 部分模板成员特化

c++ - 当元素是指针或引用时,连续内存 vector 没有优势吗?

以类名作为返回类型的java实例变量