可能重复:
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
我想知道为什么第一种情况比第二种慢得多?另外,为什么编译器优化不影响第一种情况?
我知道这是由于堆栈分配与堆分配,但如果可能的话,我想更深入地理解它。