Я во встроенной системе (впервые) и имею колоссальные 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).
У меня нет опыта в таких небольших системах; так что следующее просто догадка (самые маленькие из которых я работал с 384 К).
Изменение int
на short
или назад делает работу оптимизатора компилятора, а выход оптимизатора не может быть предсказан с точностью 100%.
Ваша платформа имеет своеобразное соглашение о передаче параметров функциям (ABI, вероятно, задокументировано вместе с компилятором). Я думаю, что стек выравнивается до 4 байтов (размер int
, который должен быть наиболее "естественным" типом для вашей платформы). В этом случае, если ваш код использует стек для передачи вашего параметра, разница в потреблении памяти не будет.
Однако:
main
функция имеет две short
локальные переменные, а не одну, они будут занимать 4 байта пространства стека, поэтому short
лучше, чем int
(и char
, если он имеет 8 бит, еще лучше)struct
; то 2 short
параметра будут занимать 4 байта В конечном счете, легко проверить этот материал. Просто посмотрите на свой вывод компилятора (машинные инструкции) или сообщите компилятору, чтобы измерить максимальную глубину стека (gcc
может это сделать, не уверен, какой компилятор вы используете).
sizeof
чтобы проверить, есть ли различия.main()
(предполагая 4-байтовоеint
).