Девиртуализация общих библиотек, удаление операций виртуального преобразователя - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь оптимизировать общий размер файла общей библиотеки. Внутри есть несколько тяжелых классов с десятками виртуальных методов и фабрик для их создания. К сожалению, я вижу огромное количество «шаблонного кода» в разделе .text, а разборка показывает, что он всегда вращается вокруг операций, связанных с «виртуальным преобразователем», и, очевидно, некоторой проверки vtable. Иногда кажется, что он принадлежит к разным методам (может быть, в зависимости от того, где вводится первый экземпляр производного класса), но результат net тот же, всегда где-то валяется огромная куча такого кода, даже с -Os.

Мне нужен способ минимизировать это, но похоже, что девиртуализация не происходит, возможно, это связано с тем, что это общая библиотека, а классы доступны в таблице символов. Но можно ли это как-то принудить, не рискуя сломать код пользователя lib?

Примечание: был выполнен обычный RTFM, применено -Os, проведен различный рефакторинг кода (для уменьшения размера кода Dynami c). Размеры функционального кода проверены несколько раз с помощью nm / objdump; Контроль экспорта символов (видимость G CC) включен, и только минимальный набор функций отмечен как видимый. К сожалению, классы также помечены как видимые, поскольку пользователю библиотеки необходимо наследовать от них.

...