在这种情况下,局部变量会占用内存吗?

时间:2019-06-03 02:02:41

标签: c

我正在一个非常有限的存储设备上编写一个应用程序,所以我必须照顾好每一个内存。

我有一些这样的代码

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会增加额外的内存消耗吗?

1 个答案:

答案 0 :(得分:3)

  

p1 p2 var是否会增加内存消耗?

您的编译器可能会优化这些变量,特别是因为它们每个变量仅设置一次且每个变量只能读取一次,但是C语言绝不承诺这样做。

此外,正如@TomKarzes在评论中观察到的,这还要求编译器能够证明这两种形式实际上是等效的。这不仅对于func2()来说不是问题,但是由于问题中给出了实际的计算顺序和函数调用,因此可能在之前计算和存储p2var的值与之后执行相同计算并将结果直接传递到func2()相比,调用func3()可以产生不同的结果。

因此,变量很可能会占用堆栈空间,直到函数返回为止。如果您确信这两种形式对您而言是等效的,那么可以通过使用函数的第一种形式而不是将决定权留给编译器来确保变量不占用空间。