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

下面的C程序使用了多少内存?,c,memory-management,stack,C,Memory Management,Stack,假设int大小为4字节。 在C代码段之后,需要多少字节来存储变量? *我读到一些可以存储在寄存器/堆栈中,但我要求总大小,因此这无关紧要 { int a,b; { int c; } { int d, e; } } 提前谢谢。你不必在意,这在很大程度上取决于旗帜和颜色 变量可以完全保留在中,然后它就不会占用内存(有时它不会出现在生成的机器代码中,因为编译器发现它是无用的)。但是,请阅读和调用帧和。当然,一个常识规则是避免巨

假设int大小为4字节。 在C代码段之后,需要多少字节来存储变量? *我读到一些可以存储在寄存器/堆栈中,但我要求总大小,因此这无关紧要

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

提前谢谢。

你不必在意,这在很大程度上取决于旗帜和颜色

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

在实践中,如果使用编译,请查看诸如
-Wstack用法=
X(将其与各种优化标志一起使用,例如
-O1
-O2
..)等。。。您将收到有关使用大量堆栈(超过X字节)的函数的警告

也要注意。最近的编译器有时能够巧妙地优化它们。想想看。编译器在优化时能够做到这一点(即使没有任何
inline
关键字)


请阅读David Chisnall的文章。

如果不使用,则什么也不用。取决于编译标志。假设由于未使用而未优化任何内容,则变量
d
(或
e
)可能使用与
c
相同的内存位置。(根据编译器的神圣见解,也可能不是)。这个问题只对实际使用的大型对象/数组(2)或其地址溢出到外部调用的大型对象/数组(1)有意义。否则,调用帧开销和临时溢出将占主导地位,并且没有理由假设它们使用任何内存。