2

可能重复:
C++ 哪个更快:堆栈分配或堆分配

我在定义和不定义 TEST 的情况下测试以下代码:

#include <cstdlib> // atoi

int main( int argc, char *argv[ ] ) {
    int times = 100000000;

    switch ( argc ) {
        case 2:
          times = atoi( argv[1] );
    } // switch

    volatile int *arr = 0;
    delete arr;

    for ( int i = 0; i < times; i += 1 ) {
    #ifdef TEST
        arr = new int[10];
        arr[0] = 5;
        delete [ ] arr;
    #else
        volatile int arr[10];
        arr[0] = 5;
    #endif
    }
}

以下是我的时间输出:

$ time ./q1test    // variable TEST defined  
real   0m7.319s  
user   0m7.289s  
sys    0m0.007s  

$ time ./q1notest  // variable TEST not defined  
real   0m0.281s  
user   0m0.276s  
sys    0m0.003s  

$ time ./q1dynopt  // variable TEST defined with compiler optimization
real   0m7.137s  
user   0m7.116s  
sys    0m0.006s  

$ time ./q1nodynopt // variable TEST not defined with compiler optimization
real   0m0.053s  
user   0m0.048s  
sys    0m0.003s  

我想知道为什么第一种情况比第二种慢得多?另外,为什么编译器优化不影响第一种情况?

我知道这是由于堆栈分配与堆分配,但如果可能的话,我想更深入地理解它。

4

0 回答 0