Оптимизация компилятора дублирующих классов - PullRequest
1 голос
/ 22 апреля 2011

Я использую C ++ в качестве промежуточного языка, для каждого объекта функции я создаю уникальный класс с методом вызова. Чего я избегаю, так это проверки, если подобная функция уже используется и ее соответствующий класс определен, так что я могу получить точно такой же класс с другим именем. Поэтому мне интересно, если компилятор (g ++) обнаружит это и объединит классы.

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011

Просто чтобы уточнить оба предыдущих ответа (которые являются хорошими ответами):

Компилятор абсолютно не объединит ваши классы.Некоторые компоновщики могут иметь некоторые оптимизации в этом направлении, но это ни в коем случае не стандартная функция, и ни стандартные компоновщики Microsoft, ни GNU / Linux не делают этого.Обычно компоновщик делает это только в том случае, если вы генерируете слабые записи с одинаковыми именами в объектных файлах напрямую, как это происходит, например, с экземплярами шаблона.Не существует стандартного способа получить это поведение непосредственно в C / C ++, хотя, по крайней мере, GCC предлагает расширения для управления этой связью самостоятельно.

Вы должны сделать это самостоятельно, хотя это на самом деле оптимизация.Джейсон прав, что это «просто» сократит размер кода, но на современных архитектурах ПК это само по себе огромная оптимизация.Кэши кода на ЦП не становятся намного больше, а скорости памяти нигде не близки к скорости ЦП, поэтому ошибки в кеше, вызванные чрезмерно огромным образом кода, могут очень серьезно повлиять на производительность.Существуют тесты, показывающие, что компиляция ядра Linux или больших приложений, таких как Firefox или OpenOffice с помощью -Os (оптимизация по размеру), в некоторых рабочих нагрузках происходит быстрее с большим отрывом, чем при компиляции с -O3.

1 голос
/ 22 апреля 2011

Нет, по крайней мере, g ++ не будет, потому что класс определяет пространство имен, поэтому функция в class A на самом деле не совпадает с функцией в class B, даже если сама функция имеет то же имя. Например, A::foo() не совпадает с B::foo().

Также в объектном файле, созданном после компиляции, имена функций искажены, поэтому A::foo() не будет иметь того же буквального имени, что и B::foo(), даже если на уровне скомпилированного объектного файла нет абстракции пространства имен. Поэтому компоновщик не сможет отсеивать функции из двух разных классов C ++ на основе их имен.

0 голосов
/ 22 апреля 2011

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

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