Обычно: используйте свою карту линкера или инструменты, чтобы выяснить, какие у вас самые большие / самые многочисленные символы, а затем, возможно, посмотрите на них, используя дизассемблер. Вы будете удивлены тем, что вы найдете таким образом.
С помощью небольшого количества perl или чего-то подобного вы можете быстро обработать файл .xMAP или результаты «objdump» или «nm» и заново отсортировать его для получения необходимой информации.
Специфично для небольших наборов команд: следите за использованием буквального пула . При изменении, например, команда ARM (32 бита на команду), установленная на набор команд THUMB (16 бит на команду), может быть полезна на некоторых процессорах ARM, поскольку она уменьшает размер поля «немедленное».
Внезапно что-то, что будет прямой загрузкой от глобальной или статической, становится очень косвенным; сначала он должен загрузить адрес global / static в регистр, а затем загрузить его, а не просто кодировать адрес непосредственно в инструкции. Таким образом, вы получаете несколько дополнительных инструкций и дополнительную запись в пуле литералов для чего-то, что обычно было бы одной инструкцией.
Стратегия борьбы с этим состоит в том, чтобы объединить глобальные и статические объекты в структуры; таким образом, вы сохраняете только один литерал (адрес вашей глобальной структуры) и вычисляете смещения от него, а не сохраняете много разных литералов при обращении к нескольким статическим / глобальным переменным.
Мы преобразовали наши «одноэлементные» классы из управления своими собственными указателями экземпляров в просто членство в большой «struct GlobalTable», и это заметно изменило размер кода (несколько процентов), а также производительность в некоторых случаях.
В противном случае: следите за статическими структурами и массивами нетривиально построенных данных. Каждый из них обычно генерирует огромное количество кода .sinit («невидимые функции», если хотите), которые запускаются перед main () для правильного заполнения этих массивов. Если вы можете использовать в статистике только тривиальные типы данных, вам будет гораздо лучше.
Это опять то, что может быть легко идентифицировано с помощью инструмента по результатам «nm» или «objdump» и т.п. Если у вас есть куча вещей .sinit, вы захотите исследовать!
Да, и - если ваш компилятор / компоновщик поддерживает это, не бойтесь выборочно включать оптимизацию или меньшие наборы команд только для определенных файлов или функций!