Как найти все структуры, которые можно уменьшить, изменив порядок их членов - PullRequest
12 голосов
/ 18 января 2010

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

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

Даже если это только уменьшит количество проверяемых вручную структур, это поможет.

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

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

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

Ответы [ 4 ]

10 голосов
/ 18 января 2010

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

9 голосов
/ 18 января 2010
Опция

-ccpad-gcc может использоваться, чтобы сообщить вам, когда структура дополняется. Это не скажет вам, когда структура может быть уменьшена, но это может помочь уменьшить работу.

1 голос
/ 18 января 2010

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

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

1 голос
/ 18 января 2010

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

...