Фон: компилятор может вставить дополнение в структуру для создания, это - участники, выравниваются лучше. Это приведет к sizeof структура, являющаяся больше, чем сумма размеров, он - участники. Переупорядочение членов структуры, таким образом, они упаковывают лучше, может устранить необходимость компилятора, чтобы заполнить этим способом и сделать структуру меньшей памятью сохранения. Я должен получить те сбережения памяти.
Опция нейтрализации состоит в том, чтобы проверить каждую структуру вручную. Я ищу автоматизированный подход, который может сократить усилие.
Даже если бы это только сокращает количество структур, которые будут проверены вручную, который помог бы.
Так, например, процесс/инструмент/и т.д., который перечисляет все структуры, которые больше, чем сумма размеров их участников, в то время как не прекрасный все еще было бы полезно, поскольку она ограничит тех, которые должны быть вручную проверены.
Делает любой знает о любых инструментах, которые могут сделать это, или может любой предлагать любые подходы, которые могли бы помочь.
p.s. Я должен сделать это на встроенной кодовой базе C, содержащей более чем 1 миллион строк кода.
Pahole - это утилита, написанная для этой конкретной цели. Это проанализирует ваши скомпилированные объектные файлы (скомпилированные с включенным отладки) и показывают вам отверстия конструкции.
Опция предупреждения GCC. Это не скажет вам, когда структура может быть сделана меньше, но она может помочь уменьшить работу.
Можно написать программу, которая, в свою очередь, записывает небольшую программу на Си для каждой перестановки полей в структуре, а когда выходная программа компилируется и запускает ее, то распечатывает размер структуры. Это будет нецелесообразно, если количество полей станет намного больше 10 или около того.
CIL - это робастный парсер на C, написанный на OCaml, который понимает набивку структур. Он поставляется с детектирующей программой на C. Структурная прокладка зависит от платформы, я не сомневаюсь, что вы знаете ее, но вы могли бы сделать ее более понятной в вашем вопросе. Программа детектирования, упакованная с CIL, определяет размер типов, а алгоритм, который CIL предполагает использовать для заполнения структур, заключается в том, что смещение n-го поля вычисляется округлением (смещение (n-1)-го поля +размер (n-1)-го поля) до ближайшего кратного (выравнивание n-го поля).
Для того, чтобы сделать нужный инструмент, начиная с CIL, было бы менее 200 строк OCaml. Но могут быть и лучшие решения.