在C ++中存储运行时变量

时间:2010-09-15 21:57:35

标签: c++ memory

这是关于C ++问题。 我有一个对象跟踪程序,它在循环中从0,...,n中获取图像。在当前帧,计算基于先前的帧,因此我需要保存那些变量,矩阵等供以后使用。此程序现在必须集成到另一个系统中,该系统将提供图像,我必须返回跟踪输出。系统稍后会执行其他过程,因此我的程序必须成为分发为DLL的函数。

我需要存储以前图像中的变量和矩阵才能再次使用它们。我不知道最好的做法是将它们写入硬盘并在另一个实例中再次读取它们。如果是这种情况,那么写/读的最佳方式和数据类型/文件是什么。该系统旨在实时。

由于

5 个答案:

答案 0 :(得分:2)

您可以查看的一点是,IS NOT THREADSAFE是将局部变量保持为static。如果您不熟悉C / C ++静态变量,它们将存储在全局内存空间中,并在函数调用之间“记住”。它们就像全局变量,但只能通过它们声明的函数来访问。运行它几次,看看会发生什么。

void foo()
{
  static int x=0;
  x++;
  cout << x << endl;
}

请记住,你不能让多个线程调用foo,因为现在只有一个状态!

或者你可以做一些事情,你可以创建一个包含本地状态副本的结构,然后将其传入。

struct state
{
  int x
};

void bar(state& s)
{
  s.x++;
  cout << s.x << endl;
}

答案 1 :(得分:1)

这取决于您的平台,但是现在很少见的是没有大量内存的平台。因此,如果您只是保存前一次传递的数据,无论多少,我的第一步就是将它全部保存在内存中。

如果你的空间不足,我的第二步就是考虑为你的系统增加更多内存。如果它额外花费100美元,并且你没有生产数千个单位,那么从长远来看,它可以节省你的工程时间。

如果没有,那么你可以担心尝试实时保存和从磁盘恢复的额外复杂性。

答案 2 :(得分:0)

不是真正的答案,只是对细节的更长时间的要求。

任何类型的数据持久性问题都涉及以下决策:

  • 所需的生命周期:应用程序控制,线程,进程,直到主机重启,无限期......?
  • 存储库有多少并发读者/编写者
  • 读者/作者如何跨网络/硬件间隔(例如,字节序问题,延迟)

你真的没有提供足够的细节来重新开始这个。

如果您的一般预感是正确的并且文件是合适的机制,您可以考虑内存映射是否适合您的要求......它往往比流式文件I / O更快。

替代方案包括共享内存段(可以比创建过程更长寿),堆...?

如果你真正关注序列化机制,你可能会看看提升。

无论如何,我不在家,所以很可能会有其他人回答......

答案 3 :(得分:0)

一些想法和建议:

存储图像的图像或属性?

通常,图像将比从图像计算的属性或数据占用更多空间。也许您可以存储图像的属性而不是整个图像。

缓存数据

将尽可能多的数据放入内存,将其余数据存储在文件中。需要回答的问题是必须在内存中的信息量(例如最后的 N 项目或可能是第一个 N 项目)。

Multi(任务或线程)

有一个线程可以根据需要缓存图像。在接收图像时,它将图像放入存储器(或属性)中。当固定存储区域填满时,它将图像(或多个属性)放置在外部存储器(例如文件)上。主线程将从缓存线程请求图像。在缓存线程删除图像后,它将该图像(或多个属性)替换为文件中的一个数据。线程可以睡眠,直到新图像出现或请求旧图像为止。

答案 4 :(得分:0)

嘿,伙计们非常感谢,我已经从你那里得到了一些想法:

  1. STL
  2. 内存映射文件
  3. 多线程
  4. 我将开始使用这些解决方案,让我们看看每个解决方案的实时要求有哪些限制。

    我将在稍后发布最终解决方案,如果我需要更多详细信息,我将针对特定主题。

    由于