我正在非常有限的存储设备上编写应用程序,因此我必须照顾好每一个内存。
我有一些这样的代码
int some_func(struct some *buf) {
func2(buf->will.be_used->very.long.pointer1);
func3(buf->will.be_used->very.long.pointer2, buf->will.be_used->very.long.var);
}
变数会很长
所以我总是这样写
int some_func(struct some *buf) {
char *p1 = buf->will.be_used->very.long.pointer1;
char *p2 = buf->will.be_used->very.long.pointer2;
int var = buf->will.be_used->very.long.var;
func2(p1);
func3(p2, var);
}
这没什么大不了的。我只是想知道会p1
p2
var
不会增加额外的内存消耗?
并
p1
p2
var
会增加额外的内存消耗?
这些变量可能会被您的编译器优化,特别是因为它们每个变量仅设置一次且每个变量仅读取一次,但是C语言绝不承诺这样做。
此外,正如@TomKarzes在评论中观察到的,这还要求编译器能够证明这两种形式实际上是等效的。但这并不是一个问题func2()
,但是随着问题中呈现的实际计算和函数调用顺序,p2
与var
在调用func2()
之后传递相同的计算结果和在调用之前计算和存储值相比,可能会产生不同的结果。结果直接到func3()
。
因此,变量很可能会占用堆栈空间,直到函数返回为止。如果您确信这两种形式对于您的目的是等效的,那么可以通过使用函数的第一种形式而不是将决定权留给编译器来确保变量不占用空间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句