以下C程序使用了多少内存?

时间:2018-11-17 12:38:48

标签: c memory-management stack

假设int大小为4个字节。 在C中的代码段之后,需要多少字节来存储变量? *我读到一些可以存储在寄存器/堆栈中,但是我询问了总大小,因此没关系。

{
    int a,b;
    {
        int c; 
    }
    {
        int d, e;
    }
}

谢谢。

1 个答案:

答案 0 :(得分:2)

您不必在意,它很大程度上取决于optimization标志和compiler

变量可以完全保留在processor register中,然后不占用内存(有时它不出现在生成的机器代码中,因为编译器发现该变量是没用的)。但是,请阅读有关call stack和呼叫帧以及register allocation的信息。当然,常识规则是避免巨大的呼叫帧(例如,避免声明非常大的automatic variables,例如double hugelocalarr[1000000];)。合理的调用框架(通常)最多应为一千字节或几个千字节(通常,总调用堆栈不应超过一兆字节或几个千字节,并且您需要考虑递归函数或深度嵌套的调用)

实际上,如果您使用GCC进行编译,请查看command options,例如-Wstack-usage= X(将其与各种优化标志一起使用,例如-O1或{{ 1}} ...)等...您会收到有关使用大量堆栈(超过X个字节)的函数的警告。

还要注意tail calls。最近的编译器有时能够巧妙地优化它们。再想想inline expansion。编译器可以在优化时做到这一点(即使没有任何-O2关键字的 )。

阅读David Chisnall的C is not a low-level language论文。