Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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