Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 由于变量被更频繁地释放,使较小的函数在内存方面通常更有效吗?_C_Compiler Construction - Fatal编程技术网

C 由于变量被更频繁地释放,使较小的函数在内存方面通常更有效吗?

C 由于变量被更频繁地释放,使较小的函数在内存方面通常更有效吗?,c,compiler-construction,C,Compiler Construction,在C语言中,将工作划分为5个函数而不是一个大函数是否会提高内存效率,因为在给定的时间,内存中的变量会更少,因为堆栈帧会更频繁地被释放?它是否依赖于编译器和优化?如果是这样,在哪些编译器中速度更快 答案是,有很多局部变量,堆栈框架来自一个集中的main,而不是在彼此的顶部创建的 我知道将函数分解为更小的函数的其他优点。请回答这个问题,仅针对内存使用。我认为在大多数情况下,为堆栈(整个程序)分配的内存区域保持不变。使用的数量将根据调用堆栈的深度而变化,并且当使用的变量较少时,使用的数量会减少(但请注

在C语言中,将工作划分为5个函数而不是一个大函数是否会提高内存效率,因为在给定的时间,内存中的变量会更少,因为堆栈帧会更频繁地被释放?它是否依赖于编译器和优化?如果是这样,在哪些编译器中速度更快

答案是,有很多局部变量,堆栈框架来自一个集中的main,而不是在彼此的顶部创建的


我知道将函数分解为更小的函数的其他优点。请回答这个问题,仅针对内存使用。

我认为在大多数情况下,为堆栈(整个程序)分配的内存区域保持不变。使用的数量将根据调用堆栈的深度而变化,并且当使用的变量较少时,使用的数量会减少(但请注意,函数调用也会推送返回地址和堆栈指针)


它还取决于函数的调用方式。例如,如果两个函数串联调用,并且第一个函数的堆栈在调用第二个函数之前弹出,那么您将使用更少的堆栈。但是,如果第一个函数调用第二个函数,那么您将使用一个大函数回到原来的位置(加上函数调用开销)。

是,同样的道理,在喷气式飞机上涂上一层更精细的油漆可以提高其空气动力学性能。好吧,这是一个糟糕的类比,但问题是,如果有任何问题,使事情清楚和电报或试图使用更多的功能,去电报。在大多数情况下,这些都不是相互排斥的,因为初学者倾向于给子程序或函数太多的事情去做

在记忆方面,我认为如果你真的在分解工作(f,然后g,然后h),那么你会看到一些微小的可用记忆增加,但是如果这些是相互依赖的,那么你不会

正如@joelburget所说,内存管理实际上并不是代码结构中的一个考虑因素


只是我的想法。

堆栈上没有内存分配-只是将堆栈指针移向下一个值。而堆栈大小本身是预定义的。因此,内存使用率没有差别(除了堆栈溢出的情况)。

将一个大函数拆分为几个小函数确实有其好处,其中一个好处是可能会优化内存使用率

你有这个功能

void huge_func(int input) {
    char a[1024];
    char b[1024];
    // do something with input and a
    // do something with input and b
}
你把它一分为二

void func_a(int input) {
    char a[1024];
    // do something with input and a
}

void func_b(int input) {
    char b[1024];
    // do something with input and b
}
调用
maging_func
将占用至少2048字节的内存,然后调用
func_a
再调用
func_b
将以大约一半的内存实现相同的结果。但是,如果在
func\u a
内部调用
func\u b
,则所使用的内存量与
庞大的func
大致相同。本质上,正如@sje397所写

我这样说可能是错误的,但我不认为有任何编译器优化可以帮助您减少堆栈内存的使用。我认为堆栈内存的布局必须确保为所有声明的变量保留足够的内存,无论是否使用。

这可能会降低程序堆栈使用的“高水位线”,如果是这样,可能会降低程序的总体内存需求

是的,这取决于优化。如果优化器内联函数调用,您可能会发现所有内联函数的所有变量都被包装到一个大堆栈框架中。任何值得使用的编译器都能够内联[*],所以它的发生并不依赖于编译器。具体发生时间将有所不同

但是,如果您的局部变量很小,那么您的程序使用的堆栈很少超过启动时自动分配给您的堆栈。除非您超过最初提供的内容,否则使用多少对总体内存需求没有影响

如果您在堆栈上放置大型结构(多个KB),或者如果您在一台机器上,一个KB占用大量内存,那么这可能会对总体内存使用产生影响。所以,如果你说的“很多局部变量”是指几十个
int
s和指针,那么不,你所做的任何事情都不会产生显著的差异。如果“很多局部变量”是指几十个10k缓冲区,或者如果你的函数递归非常深,以至于你有几百个级别的几十个
int
s,那么根据操作系统和配置,它至少可能会产生不同

堆栈和堆通过通用RAM彼此生长的模型,中间的空闲内存可以被它们中的任何一个相等地使用,过时了。除了极少数非常受限的系统外,内存模型不再以这种方式设计。在现代操作系统中,我们有所谓的“虚拟内存”,堆栈空间一次分配给程序一页。它们中的大多数会在使用堆栈时自动分配更多的页面,达到通常非常大的配置限制。有一些不会自动扩展堆栈(我上次使用的Symbian是几年前的事,但它没有自动扩展堆栈,尽管可以说Symbian不是一个“现代”的操作系统)。如果您使用的是嵌入式操作系统,请查看手册中关于堆栈的内容

无论哪种方式,影响总内存使用的唯一因素是您在任何时候需要多少个堆栈页面。若你们的系统自动扩展堆栈,你们甚至不会注意到你们使用了多少。如果没有,您将需要确保为程序提供足够的堆栈以满足其高水位标记,这时您可能会注意到堆栈使用过多

简言之,这是其中一个在理论上产生影响的因素,但在实践中,这种影响几乎总是微不足道的。只有当您的程序相对于其运行环境的资源使用了大量堆栈时,这才重要

[*]人们用C语言为图片或其他东西编程,使用C com