所以我有一个简单的递归c ++程序,非常基本:
#include <iostream>
int fibonacciRec(int no) {
if (no == 0 || no == 1)
return no;
else
return fibonacciRec(no-1) + fibonacciRec(no-2);
}
int main(int argc, char** argv) {
int no = 42;
for (int i = 1; i <= no; i++) {
std::cout << fibonacciRec(i-1) << " ";
}
std::cout << std::endl;
return 0;
}
现在,我要在此程序上运行strace
,以显示所有系统调用。基本上,我希望看到很多mmap等。但是,在调用第一个循环时,strace -f
会立即停止系统调用,而仅显示最后一个write
调用。另外,strace -c
给出的数字不太可能,因为该程序要花4-6秒钟以上的时间才能计算:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
60.47 0.000078 78 1 munmap
26.36 0.000034 11 3 brk
13.18 0.000017 3 6 fstat
0.00 0.000000 0 4 read
0.00 0.000000 0 1 write
0.00 0.000000 0 5 close
0.00 0.000000 0 14 mmap
0.00 0.000000 0 10 mprotect
0.00 0.000000 0 6 6 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 5 openat
------ ----------- ----------- --------- --------- ----------------
100.00 0.000129 57 6 total
答案 0 :(得分:1)
运行fibonacciRec
时不需要进行任何mmap或任何其他系统调用。
唯一可以分配的内存是递归调用的堆栈内存,有几种原因使您的内存没有出现在strace
中:
strace
也看不到它。 fibonacciRec
除了调用自身并返回值外,不执行任何操作,只能操作局部变量。没有系统调用。