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

garen96

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

我有一些这样的代码

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(),但是随着问题中呈现的实际计算和函数调用顺序,p2var在调用func2()之后传递相同的计算结果在调用之前计算和存储值相比,可能会产生不同的结果。结果直接到func3()

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在这种情况下静态局部变量不保留它的值?

在这种情况下我必须删除内存吗?

在这种情况下,python的slice函数是否占用大量内存?

UnboundLocalError:赋值之前引用了局部变量'n'-如何识别和删除此变量?还是在这种情况下进行调试?

默认情况下,C 中未初始化的局部变量是静态的吗?

Perl:在这种情况下可以跳过中间哈希变量吗?

在这种情况下可以实现hashCode()方法吗?

在这种情况下,我需要“默认”语句吗?

在这种情况下可以重写ToString()方法吗

在这种情况下使用 SQL PIVOT 吗?

在这种情况下应该使用cron工作吗?

我可以在这种情况下使用枚举吗?

在这种情况下,数组会取消分配吗?

Go:在这种情况下需要频道吗?

在这种情况下真的需要 FlexibleContexts 吗?

Swift在这种情况下会复制突变吗?

在这种情况下eval()是邪恶的吗?

在这种情况下应避免附着吗?

在这种情况下可以更改图标吗?

在这种情况下可以实现Rest Api吗?

在这种情况下我应该检查指针吗?

在这种情况下,如何为变量添加ID?

在这种情况下如何访问变量?

在这种情况下,如何更改变量的值?

在这种情况下,为什么编译器要专门用于存储冗余变量的内存位置?

在这种情况下,为什么vim占用\ ze之后的模式?

在这种情况下,simpletype无效

在这种情况下如何撰写

在这种情况下阅读JSON?