定时数组静态数组分配与C中堆栈上的数组

时间:2014-09-28 19:39:05

标签: c arrays static stack

我有以下代码,包含两个函数,一个用于分配静态数组,另一个用于在堆栈上分配数组。这些函数运行很多次并计算它们的执行时间。堆栈分配始终(略微)快于静态分配。我的印象是,因为静态变量在运行时被绑定,它的执行速度比在堆栈上分配的数组要快

 #include <stdio.h>

#include <stdlib.h>
#include <time.h>
#define MAX_ARRAY 8192 

void statArray()
{
static int statArray[MAX_ARRAY];
}
void stackArray()
{
int stackArray[MAX_ARRAY];
}

int main(int argc, char * argv[]) {
     clock_t start, end;
     double staticTime, stackTime;
     int i;
     int comparisons = 5000000;

     start = clock();
     for (i = 0; i < comparisons; i++) {
          statArray();
     }
     end = clock()-start;
     staticTime = (double)end / CLOCKS_PER_SEC;

     start = clock();
     for (i = 0; i < comparisons; i++) {
          stackArray();
     }
     end = clock() - start;
     stackTime = (double) end / CLOCKS_PER_SEC;

由于

反汇编statArray

 0x0000000000400594 <+0>:   push   %rbp
   0x0000000000400595 <+1>: mov    %rsp,%rbp
   0x0000000000400598 <+4>: leaveq 
   0x0000000000400599 <+5>: retq   

反汇编的stackArray

0x000000000040059a <+0>:    push   %rbp
   0x000000000040059b <+1>: mov    %rsp,%rbp
   0x000000000040059e <+4>: sub    $0x7f88,%rsp
   0x00000000004005a5 <+11>:    leaveq 
   0x00000000004005a6 <+12>:    retq   

1 个答案:

答案 0 :(得分:3)

正如您在汇编列表中看到的那样,statArray是一个空函数,stackArray包含单个分配指令(sub rbp,imm)。该指令的时间效应可能隐藏在序言/结尾指令的延迟中,并且差异只能用cpu温度计来测量。您遇到的实际差异是由于轻微的时间测量错误,如果您交换代码块的顺序可能会改变。

编辑:值得注意的是,堆栈分配只不过是通过从堆栈指针寄存器中减去来修复堆栈顶部而不涉及任何复杂的逻辑(与malloc相对),而静态vs堆栈“速度”似乎是一种常见的误解。