Использует ли локальная переменная в этом случае память? - PullRequest
2 голосов
/ 03 июня 2019

Я пишу приложение на очень ограниченном устройстве памяти, поэтому мне нужно заботиться о каждом бите памяти.

У меня есть такой код

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 Ответ

3 голосов
/ 03 июня 2019

делает p1 p2 var дополнительным потреблением памяти?

Возможно, эти переменные будут оптимизированы вашим компилятором, особенно если они установленытолько один раз и читайте только один раз, но язык Си никоим образом не обещает этого.

Более того, поскольку @TomKarzes замечает в комментариях, это также требует, чтобы компилятор мог доказать, что две формы находятся вФактический эквивалент.Это не будет проблемой только для func2(), но с фактической последовательностью вычислений и вызовов функций, представленных в вопросе, возможно, что вычисление и сохранение значений для p2 и var перед вызовом func2() может привести крезультаты, отличающиеся от тех, которые выполнялись бы после выполнения тех же вычислений и передачи результатов непосредственно в func3().

Таким образом, переменные очень хорошо могли бы занимать место в стеке, пока функция не вернется.Если вы уверены, что эти две формы эквивалентны для ваших целей, то вы можете убедиться, что переменные не занимают места, используя первую форму вашей функции, вместо того, чтобы оставлять решение своему компилятору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...