Как найти все структуры, которые могли быть сделаны меньшими путем изменения порядка их участников

Фон: компилятор может вставить дополнение в структуру для создания, это - участники, выравниваются лучше. Это приведет к sizeof структура, являющаяся больше, чем сумма размеров, он - участники. Переупорядочение членов структуры, таким образом, они упаковывают лучше, может устранить необходимость компилятора, чтобы заполнить этим способом и сделать структуру меньшей памятью сохранения. Я должен получить те сбережения памяти.

Опция нейтрализации состоит в том, чтобы проверить каждую структуру вручную. Я ищу автоматизированный подход, который может сократить усилие.

Даже если бы это только сокращает количество структур, которые будут проверены вручную, который помог бы.

Так, например, процесс/инструмент/и т.д., который перечисляет все структуры, которые больше, чем сумма размеров их участников, в то время как не прекрасный все еще было бы полезно, поскольку она ограничит тех, которые должны быть вручную проверены.

Делает любой знает о любых инструментах, которые могут сделать это, или может любой предлагать любые подходы, которые могли бы помочь.

p.s. Я должен сделать это на встроенной кодовой базе C, содержащей более чем 1 миллион строк кода.

12
задан Gordon Wrigley 22 December 2011 в 02:12
поделиться

4 ответа

Pahole - это утилита, написанная для этой конкретной цели. Это проанализирует ваши скомпилированные объектные файлы (скомпилированные с включенным отладки) и показывают вам отверстия конструкции.

10
ответ дан 2 December 2019 в 07:21
поделиться

Опция предупреждения GCC. Это не скажет вам, когда структура может быть сделана меньше, но она может помочь уменьшить работу.

9
ответ дан 2 December 2019 в 07:21
поделиться

Можно написать программу, которая, в свою очередь, записывает небольшую программу на Си для каждой перестановки полей в структуре, а когда выходная программа компилируется и запускает ее, то распечатывает размер структуры. Это будет нецелесообразно, если количество полей станет намного больше 10 или около того.

1
ответ дан 2 December 2019 в 07:21
поделиться

CIL - это робастный парсер на C, написанный на OCaml, который понимает набивку структур. Он поставляется с детектирующей программой на C. Структурная прокладка зависит от платформы, я не сомневаюсь, что вы знаете ее, но вы могли бы сделать ее более понятной в вашем вопросе. Программа детектирования, упакованная с CIL, определяет размер типов, а алгоритм, который CIL предполагает использовать для заполнения структур, заключается в том, что смещение n-го поля вычисляется округлением (смещение (n-1)-го поля +размер (n-1)-го поля) до ближайшего кратного (выравнивание n-го поля).

Для того, чтобы сделать нужный инструмент, начиная с CIL, было бы менее 200 строк OCaml. Но могут быть и лучшие решения.

1
ответ дан 2 December 2019 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: