下面的C程序使用了多少内存?
假设int大小为4字节。 在C代码段之后,需要多少字节来存储变量? *我读到一些可以存储在寄存器/堆栈中,但我要求总大小,因此这无关紧要下面的C程序使用了多少内存?,c,memory-management,stack,C,Memory Management,Stack,假设int大小为4字节。 在C代码段之后,需要多少字节来存储变量? *我读到一些可以存储在寄存器/堆栈中,但我要求总大小,因此这无关紧要 { int a,b; { int c; } { int d, e; } } 提前谢谢。你不必在意,这在很大程度上取决于旗帜和颜色 变量可以完全保留在中,然后它就不会占用内存(有时它不会出现在生成的机器代码中,因为编译器发现它是无用的)。但是,请阅读和调用帧和。当然,一个常识规则是避免巨
{
int a,b;
{
int c;
}
{
int d, e;
}
}
提前谢谢。你不必在意,这在很大程度上取决于旗帜和颜色 变量可以完全保留在中,然后它就不会占用内存(有时它不会出现在生成的机器代码中,因为编译器发现它是无用的)。但是,请阅读和调用帧和。当然,一个常识规则是避免巨大的调用帧(例如,避免声明非常大的调用帧,例如
double hugelocalarr[1000000];
)。一个合理的调用帧(通常)最多应该是一个千字节或几个千字节(通常,总调用堆栈不应该超过一个兆字节或几个兆字节,您需要考虑递归函数或深度嵌套调用)
在实践中,如果使用编译,请查看诸如-Wstack用法=
X(将其与各种优化标志一起使用,例如-O1
或-O2
..)等。。。您将收到有关使用大量堆栈(超过X字节)的函数的警告
也要注意。最近的编译器有时能够巧妙地优化它们。想想看。编译器在优化时能够做到这一点(即使没有任何inline
关键字)
请阅读David Chisnall的文章。如果不使用,则什么也不用。取决于编译标志。假设由于未使用而未优化任何内容,则变量
d
(或e
)可能使用与c
相同的内存位置。(根据编译器的神圣见解,也可能不是)。这个问题只对实际使用的大型对象/数组(2)或其地址溢出到外部调用的大型对象/数组(1)有意义。否则,调用帧开销和临时溢出将占主导地位,并且没有理由假设它们使用任何内存。