2011-04-22 14 views
1

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

ответ

2

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

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

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

0

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

1

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

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

Смежные вопросы