在C ++函数中分配大型本地内存的最佳方法

时间:2011-12-05 09:47:25

标签: c++ memory-management allocation

我有一个程序,其中我是一个相当大的内存块的表,它是一个具有两个整数的结构(它们必须至少4个字节,一个块才能容纳1,000,000,000)。该结构目前只有500多个条目。所以我们谈论的是4k。 4k的堆栈空间看起来并不是很多,但对于一个只能在蓝色月亮中调用一次的函数来说它似乎很浪费。 (假设我们将在程序的整个生命周期内调用它一次,所以如果分配的速度稍慢,那就可以了,因为该空间在分配时间内更有价值)。

代码只是一个简单的值查找,生成它的代码非常繁重,我们只是在寻找特定的值。我已经有了代码,而且查找起来要快得多,所以毫无疑问我想沿着这条路走下去。我可以添加一个文件加载来从文件中获取数据,但对我来说,至少在这一点上看起来有些过分。

现在我有两种方法可以分配它。使其成为全局变量,并使其成为局部变量。显然,本地是要走的路,因为只有这个功能需要表。然而,我正在寻找的是,如果我可以使用任何关键字,或任何加载该变量的方式(目前它只是这些对的数组)将是最有益的。

我最好的情况是让它只在函数范围内尝试在内存中,然后允许将该内存返回给系统。以尽可能高效的方式。除了使我应该采取的本地数据之外还有一个步骤吗?

3 个答案:

答案 0 :(得分:2)

  

除了我应该采用本地数据之外还有一个步骤吗?

没有更多。它应该是这样的:

void proc() {
  t_thing things[500]; // << you could use std::array here too
}

令人怀疑的是,它对您的需求“缓慢”。如果要改进这一点,指定对齐可能有所帮助。

答案 1 :(得分:2)

只需在堆栈上分配

void dowork()
{
     int temp[512];
}

这不浪费,因为它只会在执行函数时在堆栈上分配。

或者(如果堆栈空间不足),

void dowork()
{
     std::vector<int> temp(512);
}

将把大量已分配的内存放在堆上

答案 2 :(得分:1)

如果在函数调用之间保持不变,并且你可以省去经常不需要的4K内存,你可以将它作为本地静态变量。

void func()
{
    static int array[] = {...};
}

它几乎完全作为一个全局变量,除了它只能从这个函数内部看到。

当您加载程序时,它所需的内存将在数据段(分配全局变量的同一位置)中分配,并在应用程序关闭时释放。根据生成此表的方式,可能还会在加载程序时设置值,但前提是它们是常量。如果在编译时未知这些值,则在第一次调用此函数时将设置它们。