Недавно я решил использовать инертный виртуальный интерфейс (NVI) для разработки интерфейса на C++, в основном с целью использования параметра со значением по умолчанию (таким образом, избегая проблем, вызванных тем, что параметры по умолчанию статически связаны) ,Использование идиомы не-виртуального интерфейса, может/будет ли моя не виртуальная функция быть встроенной?
я пришел с довольно тривиальной декларацией для моего класса, глядя, как это:
class Interface{
public:
void func(Parameter p = 0);
virtual ~Interface();
private:
virtual void doFunc(Parameter p)=0;
};
void Interface::func(Parameter p){ doFunc(p); }
Interface::~Interface() {}
Я знаю, что предоставление тела функции в заголовке автоматически маркировать функцию в качестве кандидата на встраивание (хотя я не знайте, не помешает ли размещение определения вне класса). Я также знаю, что виртуальная функция не встроена по очевидным причинам (мы не знаем, какая функция будет вызываться во время выполнения, поэтому мы не можем заменить вызовы телом функции).
Тогда в этом случае будет помечен кандидат для встраивания? func()
? Это не виртуальная функция, но все же звонки виртуальная функция. Это делает его встроенным?
Дополнительный вопрос: стоит ли это? Тело состоит только из одного заявления.
Обратите внимание, что этот вопрос скорее для того, чтобы узнать об этом, а не искать оптимизацию во всем мире. Я знаю, что эта функция будет называться только несколько раз (ну, на данный момент, так что может быть разумным в отношении того, как развивается программа), и эта вложение будет излишней, а не основной проблемой производительности моей программы.
Спасибо!
, который полностью зависит от вашего компилятора, его текущей версии, функций сборки, параметров для нее, платформы, инструментов построения и т. Д. – PlasmaHH
Возможно, я ошибаюсь, но я считаю, что компилятору разрешено встроить даже «виртуальные» функции в случаях где он может точно знать, какую функцию вызывать. – ereOn
@ereOn Я был бы очень удивлен этим, поскольку вложение означает «Заменить вызов функций своим телом во время компиляции» и виртуальными средствами «Подождите, пока время выполнения не будет определено, какую функцию нужно вызывать». – JBL