Использование локального короткого замыкания для передачи значения в функцию, ожидающую int; это экономит память?

0

Я во встроенной системе (впервые) и имею колоссальные 512 байт памяти. Я постоянно сталкиваюсь с этим барьером, и я хочу сохранить каждый байт. Таким образом, возникает следующий вопрос:

В SDK есть функция, прототипированная:

void foo(int val);

Таким образом, мой главный вид выглядел так:

void main() {
    int myVal = 0;
    // do stuff to compute myVal
    foo(myVal);
}

myVal, однако, никогда не будет иметь значение больше, чем ~ 100. Смогу ли я сохранить любую память, сделав это вместо этого?

void main() {
    short int myVal = 0;
    // do stuff to compute myVal
    foo(myVal);
}

edit: В этой архитектуре ints составляют 4 байта, шорты - 2 байта. Я в основном не уверен, будет ли использование локального короткого (или символа или что-то еще) сэкономить место, поскольку оно должно быть выполнено, чтобы соответствовать прототипу foo (int).

  • 0
    stackoverflow.com/questions/589575/size-of-int-long-etc это может вам помочь. Вы также можете вызвать метод sizeof чтобы проверить, есть ли различия.
  • 2
    Я бы посмотрел на сгенерированную сборку в обоих случаях и сравнил. В некоторых системах компилятор может передавать аргументы функции через регистры. Если бы это было так, вы могли бы потенциально сохранить 2 байта стекового пространства в main() (предполагая 4-байтовое int ).
Показать ещё 5 комментариев
Теги:
memory
embedded

1 ответ

0

У меня нет опыта в таких небольших системах; так что следующее просто догадка (самые маленькие из которых я работал с 384 К).

Изменение int на short или назад делает работу оптимизатора компилятора, а выход оптимизатора не может быть предсказан с точностью 100%.

Ваша платформа имеет своеобразное соглашение о передаче параметров функциям (ABI, вероятно, задокументировано вместе с компилятором). Я думаю, что стек выравнивается до 4 байтов (размер int, который должен быть наиболее "естественным" типом для вашей платформы). В этом случае, если ваш код использует стек для передачи вашего параметра, разница в потреблении памяти не будет.

Однако:

  • Если ваши функции имеют 1 или несколько параметров, они будут помещаться в регистры, а не в стек (ARM делает это для первых 4 параметров), поэтому потребление памяти не уменьшается
  • Если ваша main функция имеет две short локальные переменные, а не одну, они будут занимать 4 байта пространства стека, поэтому short лучше, чем intchar, если он имеет 8 бит, еще лучше)
  • Если вы хотите отправить два параметра, а не один, вы можете записать их в struct; то 2 short параметра будут занимать 4 байта

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню