Альтернативный заголовок вопроса будет: Как явно заставить компилятор генерировать код для сгенерированных компилятором конструкторов в определенной единице перевода?
Проблема, с которой мы сталкиваемся, заключается в том, что для одного кодапуть к полученной - тщательно измеренной - производительности лучше (примерно на 5%), если вызовы copy-ctor одного объекта не встроены, то есть если этот конструктор реализованвручную.(Мы заметили это, потому что во время очистки кода была удалена лишняя явно реализованная копия ctor этого класса (17 членов).)
Редактировать: Обратите внимание, что у нас есть проверил сгенерированный код сборки и удостоверился, что встраивание и генерация кода происходят, как я описываю для двух разных версий кода.
Теперь перед нами стоит выбор - просто сбросить код copy-ctor вручную (он делает то же самое, что и сгенерированный компилятором) или найти другие способы , а не , вставляющие копиюctor этого класса.
Существуют ли какие-либо средства (для Microsoft Visual C ++) для явного создания экземпляров функций классов, сгенерированных компилятором, в конкретной единице перевода или они всегда будут встроены в каждую единицу перевода, где они используются?(Комментарии к gcc или другим компиляторам также позволяют получить более полное представление о ситуации.)
Поскольку первые 2 ответа показывают некоторое недопонимание: компилятор сгенерировал функции классагенерируется только самим компилятором, если они не объявлены и не определены пользователем.Поэтому никакие модификаторы не могут быть применены к ним, так как эти функции не существуют в исходном коде.
struct A {
std::string member;
};
A
имеет значение по умолчанию и копию ctor, dtor и копиюоператор.Ни одна из этих функций не может быть изменена с помощью некоторого declspec, поскольку они не существуют в коде.
struct B {
std::string member;
B(B const& rhs);
};
B
теперь имеет предоставленный пользователем copy ctor, и пользователь должен реализоватьЭто.Компилятор не будет генерировать для него код.
Еще немного предыстории для сомневающихся :-) ...
Этот код скомпилирован с использованием MS Visual C ++, но он связан длявстроенная (-подобная) (в реальном времени) система.Производительность измерялась с помощью измерения времени в этой системе, и поэтому я думаю, что у парней, которые взяли время, будут приличные числа.
Тест проводился путем сравнения двух версий кода, в которых разница была только .был встроенный и не встроенный экземпляр ctor этого одного класса.Времена с встроенным кодом были хуже примерно на 5%.
Дальнейшая проверка показала, что я ошибся в одном: компилятор будет генерировать отдельные функции для конструкторов сложных копий.Он будет делать это по своему усмотрению, а также зависит от настроек оптимизации.Так что в нашем случае компилятор делает неправильные вещи в наших конкретных обстоятельствах.Из ответов до сих пор не видно, что мы можем сказать компилятору иначе.: - (