мой размер Dll сдувается введением больших случаев переключения, как я могу уменьшить свой размер Dll (MSVC C ++)? - PullRequest
1 голос
/ 14 февраля 2011

Размер моего Dll составляет 2 МБ. Теперь у меня есть ситуация, когда мне нужно добавить корпус переключателя с 2500 корпусами. Каждый случай вызывает функцию. Таким образом, через этот корпус коммутатора вызывается 2500 различных функций, в которых содержится 2500 корпусов. (Весь код для 2500 функций уже существует в DLL размером 2 МБ. Дополнительный код включен только в случаях переключения). Теперь моя проблема заключается в том, что размер библиотеки DLL увеличивается на 15 МБ в сборке выпуска, в результате чего размер DLL в 17 МБ, что является огромным в соответствии с моими требованиями. Пожалуйста, предложите мне какой-нибудь способ, которым я могу поддерживать свой размер Dll до минимума, обрабатывая случаи переключения должным образом ... любые альтернативные методы ..
Я использую MSVC 2005, C / C ++. Я использовал оптимизацию, чтобы минимизировать размер (/ 01), / ltcg, (/ OPT: REF), (/ OPT: ICF) и т. Д. - все наилучшие возможности оптимизации. (Без использования предварительно скомпилированных заголовков)

Ваши предложения очень нужны

Спасибо заранее Анил

Ответы [ 4 ]

3 голосов
/ 14 февраля 2011

Если все функции имеют одинаковую сигнатуру, рассмотрите возможность заполнения map или аналогичной структуры данных с помощью указателей на функции, которые вы включаете в качестве ключа поиска. Ни один человек не сможет понять оператор switch с 2500 случаями, поэтому я бы порекомендовал не включать его в ваш код.

2 голосов
/ 14 февраля 2011

Почти наверняка у вас много дублированного кода в ваших блоках case (через макросы / встроенные функции / STL). Измените ваш случай, чтобы использовать не встроенную функцию с аргументами, чтобы уменьшить каждый блок дела до "HandleGenericCase (x);". Не используйте STL или другой шаблон / встроенный код в ваших кейсах.

Не видя ваш код, будет трудно дать хороший ответ, и в этом случае «проверить конкретную причину вздутия» - действительно лучший совет.

1 голос
/ 14 февраля 2011

Даже если оператор switch занимает 100 байтов в каждом случае, это всего лишь 1/4 МБ, и, вероятно, это намного меньше.

Можете ли вы получить файл карты библиотеки DLL?Я бы сделал это и просто наугад несколько раз протестировал, чтобы увидеть, какие там функции.Бьюсь об заклад, он полон вещей, которые вам на самом деле не нужны, часто генерируются шаблонами.

Кроме того, я уверен, что эти 2500 функций содержат много газа.Если оператор switch является единственным способом их вызова, их можно развернуть в строке прямо в операторе switch, сохранив много кода входа / выхода.

0 голосов
/ 16 февраля 2011

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

...