Если ваш процессор не имеет аппаратной поддержки для параметра / локального стека, но компилятор все равно пытается реализовать стек параметров времени выполнения, и если ваш код не нуждается в повторном вводе, вы можете сохранить код пространство путем статического распределения авто переменных. В некоторых случаях это должно быть сделано вручную; в других случаях директивы компилятора могут это сделать. Эффективное ручное распределение потребует разделения переменных между подпрограммами. Такое совместное использование должно быть сделано осторожно, чтобы гарантировать, что ни одна процедура не использует переменную, которую другая процедура считает находящейся «в области видимости», но в некоторых случаях преимущества размера кода могут быть значительными.
Некоторые процессоры имеют соглашения о вызовах, которые могут сделать некоторые стили передачи параметров более эффективными, чем другие. Например, на контроллерах PIC18, если подпрограмма принимает один однобайтовый параметр, она может быть передана в регистр; если требуется больше, все параметры должны быть переданы в ОЗУ. Если подпрограмма будет принимать два однобайтовых параметра, может быть наиболее эффективно «передать» один из них в глобальную переменную, а затем передать другой в качестве параметра. Благодаря широко используемым подпрограммам можно сэкономить. Они могут быть особенно значительными, если параметр, передаваемый через global, является однобитовым флагом или если он обычно будет иметь значение 0 или 255 (поскольку существуют специальные инструкции для хранения 0 или 255 в ОЗУ).
В ARM размещение глобальных переменных, которые часто используются вместе, в структуре может значительно уменьшить размер кода и повысить производительность. Если A, B, C, D и E являются отдельными глобальными переменными, то код, который использует все из них, должен загрузить адрес каждого в регистр; если регистров недостаточно, может потребоваться перезагрузить эти адреса несколько раз. Напротив, если они являются частью одной и той же глобальной структуры MyStuff, то код, который использует MyStuff.A, MyStuff.B и т. Д., Может просто один раз загрузить адрес MyStuff. Большая победа.