哪个分配更快?malloc vs局部变量

Lun*_*oms 10 c linux malloc gcc

哪种是为频繁分配和释放内存的函数分配内存的首选方法?假设此功能在1GHz处理器上每秒调用大约500到1000次.

(请忽略静态和全局变量/分配.我只对这个具体情况感兴趣:)

void Test()
{
    ptr=malloc(512)   // 512 bytes
    ...
    free(ptr) 
}
Run Code Online (Sandbox Code Playgroud)

要么

void Test()
{
     struct MyStruct localvar; // 512 byte sized structure
     ... 
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 20

堆栈分配局部变量比堆分配快malloc.但是,总堆栈空间有限(例如,几兆字节).因此,您应该将自己限制为本地堆栈上的"小"数据.(根据今天的标准,512字节很小,但256Kb对于本地堆栈分配来说太大了).

如果你的函数是非常递归的,那么甚至512字节也可能太大,因为你需要为每个递归调用帧.

malloc每秒呼叫几千次应该是无痛的(恕我直言,典型的小型malloc需要几十微秒).

为了您的好奇心,在C世界之外,您可能对旧的感兴趣A.Appel的纸质垃圾收集可能比堆栈分配更快(但可能缓存性能考虑可能会削弱今天的声明).


Jon*_*Jon 6

本地变量基本上是"免费"分配的,所以如果我们只对性能感兴趣,那么这里没有竞争.

然而:

  • 在本地和堆分配的变量之间的选择通常不是你可以自由决定的,没有约束; 通常有一些因素要求选择,所以你的问题有点怀疑,因为它似乎无视这个问题
  • 虽然在堆栈上分配是"免费的"性能,但堆栈上的空间可能是有限的(尽管当然512字节是没有的)