我正在尝试优化一个程序。 该程序不使用堆。 我想分析堆栈的大小以查看:
我已经用这种方式尝试了 valgrind 和 Massif:
valgrind --tool=massif --stacks=yes ./program
例如一个简单的 hello world
#include <stdio.h>
void main()
{
int input;
scanf("%d", &input);
if (input == 1)
{
printf("Hello world\n");
}
else
{
printf("Goodbye world\n");
}
}
编译它
gcc -o main main.c
使用 valgrind 运行它
buba98@buba-laptop:~/projects$ valgrind --tool=massif --stacks=yes ./main
==18236== Massif, a heap profiler
==18236== Copyright (C) 2003-2017, and GNU GPL'd, by Nicholas Nethercote
==18236== Using Valgrind-3.21.0 and LibVEX; rerun with -h for copyright info
==18236== Command: ./main
==18236==
1
Hello world
==18236==
你可以尝试这样的事情:
#include <stdio.h>
// Get stack pointer.
static inline unsigned char *sp() {
register unsigned char *r;
asm volatile ("mov %0, sp" : "=r" (r));
return r;
}
unsigned char *top;
void recur(int n) {
if (n == 0)
return;
recur(n - 1);
printf("n = %d, stack = %zd\n", n, top - sp());
}
int main(void) {
top = sp();
recur(10);
return 0;
}
其中
sp()
在每个函数的最深处被调用,结果按照你喜欢的方式跟踪。
经过优化,打印:
n = 1, stack = 480
n = 2, stack = 432
n = 3, stack = 384
n = 4, stack = 336
n = 5, stack = 288
n = 6, stack = 240
n = 7, stack = 192
n = 8, stack = 144
n = 9, stack = 96
n = 10, stack = 48